我的JavaScript有时会在这一行崩溃:
var json = eval('(' + this.responseText + ')');
如果eval()
的参数不是JSON格式,就会导致崩溃。有没有办法在调用之前检查字符串是否为JSON格式?
我不想使用框架 - 有没有办法只使用eval()
使其工作?(我保证有很好的理由。)
我的JavaScript有时会在这一行崩溃:
var json = eval('(' + this.responseText + ')');
如果eval()
的参数不是JSON格式,就会导致崩溃。有没有办法在调用之前检查字符串是否为JSON格式?
我不想使用框架 - 有没有办法只使用eval()
使其工作?(我保证有很好的理由。)
如果你从json.org引入JSON解析器,你可以使用它的parse()函数,并将其放在try/catch中,就像这样:
try
{
var json = JSON.parse(this.responseText);
}
catch(e)
{
alert('invalid json');
}
像这样的代码可能会实现你想要的功能。
这里是jQuery的替代方案...
try
{
var jsonObject = jQuery.parseJSON(yourJsonString);
}
catch(e)
{
// handle error
}
我强烈建议您使用JavaScript JSON库来进行JSON的序列化和反序列化操作。使用eval()
存在安全风险,除非您绝对确定输入已经过净化处理且安全可靠,否则不应使用。
如果您已经使用了JSON库,只需在其等效的parse()
调用周围包装一个try/catch语句块以处理非JSON输入:
try
{
var jsonObject = JSON.parse(yourJsonString);
}
catch(e)
{
// handle error
}
<!DOCTYPE html>
<html>
<body>
<h3>Open console, please, to view result!</h3>
<p id="demo"></p>
<script>
var tryJSON = function (test) {
try {
JSON.parse(test);
}
catch(err) {
// maybe you need to escape this… (or not)
test = '"'+test.replace(/\\?"/g,'\\"')+'"';
}
eval('test = '+test);
console.debug('Try json:', test);
};
// test with string…
var test = 'bonjour "mister"';
tryJSON(test);
// test with JSON…
var test = '{"fr-FR": "<p>Ceci est un texte en français !</p>","en-GB": "<p>And here, a text in english!</p>","nl-NL": "","es-ES": ""}';
tryJSON(test);
</script>
</body>
</html>
function isJsonStr(str) {
var parsedStr = str;
try {
parsedStr = JSON.parse(str);
} catch (e) {
return false;
}
return typeof parsedStr == 'object'
}
jQuery $.ajax()
将在响应对象中添加responseJSON
属性,为了测试响应是否为JSON,您可以使用:
if (xhr.hasOwnProperty('responseJSON')) {}
为什么你不能直接检查响应是什么?这样更加高效。
var result;
if (response.headers['Content-Type'] === 'application/json')
result = JSON.parse(this.responseText);
else
result = this.responseText;
有一个小型的库可以检查JavaScript类型:is.js
is.json({foo: 'bar'});
=> true
// functions are returning as false
is.json(toString);
=> false
is.not.json([]);
=> true
is.all.json({}, 1);
=> false
is.any.json({}, 2);
=> true
// 'all' and 'any' interfaces can also take array parameter
is.all.json([{}, {foo: 'bar'}]);
=> true
实际上is.js不仅仅是这样,还有一些值得一提的功能:
var obj = document.createElement('div');
is.domNode(obj);
=> true
is.error(new Error());
=> true
is.function(toString);
=> true
is.chrome();
=> true if current browser is chrome