AJAX:如何检查一个字符串是否为JSON?

84

我的JavaScript有时会在这一行崩溃:

var json = eval('(' + this.responseText + ')');

如果eval()的参数不是JSON格式,就会导致崩溃。有没有办法在调用之前检查字符串是否为JSON格式?

我不想使用框架 - 有没有办法只使用eval()使其工作?(我保证有很好的理由。)


你可以在try/catch中尝试使用JSON.parse()...如果进入catch块,则表示它不是有效的JSON标记。当然,这有点低效,呵呵... 您能给我一个您得到的无效JSON标记的例子吗? - Warty
8个回答

158

如果你从json.org引入JSON解析器,你可以使用它的parse()函数,并将其放在try/catch中,就像这样:

try
{
   var json = JSON.parse(this.responseText);
}
catch(e)
{
   alert('invalid json');
}

像这样的代码可能会实现你想要的功能。


10
使用jQuery.parseJSON(..),您无需包含json.org。 - RayLoveless
1
@Raymo OP没有提到使用jQuery和json2.js,后者的文件大小不到jQuery的一半。 - brettkelly
解析整个字符串是不好的实践,抛出异常可能会导致延迟。 - redolent
如果您发送一个数字字符串,它不会抛出异常。 - Hesham Yassin

22

这里是jQuery的替代方案...

try
{
  var jsonObject = jQuery.parseJSON(yourJsonString);
}
catch(e)
{
  // handle error 
}

16

我强烈建议您使用JavaScript JSON库来进行JSON的序列化和反序列化操作。使用eval()存在安全风险,除非您绝对确定输入已经过净化处理且安全可靠,否则不应使用。

如果您已经使用了JSON库,只需在其等效的parse()调用周围包装一个try/catch语句块以处理非JSON输入:

try
{
  var jsonObject = JSON.parse(yourJsonString);
}
catch(e)
{
  // handle error 
}

2
也许这可以帮助你: 使用这段代码,你可以直接获取你的数据...

<!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>


有很多替代方法可以达到相同的结果,使用eval()可能是最不合适的一种。 - David

1
依赖于“try-catch”方法的问题在于“JSON.parse('123')= 123”,它不会抛出异常。因此,除了使用“try-catch”之外,我们还需要按以下方式检查类型:
function isJsonStr(str) {
    var parsedStr = str;
    try {
        parsedStr = JSON.parse(str);
    } catch (e) {
        return false;
    }
    return typeof parsedStr == 'object'
}

0

jQuery $.ajax()将在响应对象中添加responseJSON属性,为了测试响应是否为JSON,您可以使用:

if (xhr.hasOwnProperty('responseJSON')) {}

0

为什么你不能直接检查响应是什么?这样更加高效。

var result;

if (response.headers['Content-Type'] === 'application/json')
    result = JSON.parse(this.responseText);
else
    result = this.responseText;

screen1


-1

有一个小型的库可以检查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



网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接