AJAX:检查字符串是否为JSON?


83

我的JavaScript有时在此行崩溃:

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

当的参数eval()不是JSON时会导致崩溃。有没有办法在进行此调用之前检查字符串是否为JSON?

我不想使用框架-有什么办法可以使用Just来完成这项工作eval()?(我保证这是有充分的理由的。)


您可以尝试在try / catch中尝试JSON.parse()...如果发现,它是无效的JSON标记。当然,多数民众赞成在效率低下,嘿...您能举一个我得到的无效JSON标记的例子吗?
Warty 2010年

Answers:


157

如果包含json.org中的JSON解析器,则可以使用其parse()函数并将其包装在try / catch中,如下所示:

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

这样的事情可能会做你想要的。


9
使用jQuery.parseJSON(..),您不需要包含json.org
RayLoveless 2012年

1
@Raymo OP没有提到使用jQuery和json2.js小于jQuery大小的一半(就文件大小而言)。
brettkelly 2012年

解析整个字符串是不好的做法,并抛出一个异常会导致滞后
芳香

如果您发送数字字符串,它将不会引发异常
Hesham Yassin '18

21

她是jQuery的替代品...

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

15

我强烈建议您使用JavaScript JSON库JSON之间进行序列化。eval()是一种安全风险,除非您完全确定其输入内容经过消毒和安全,否则切勿使用。

有了JSON库之后,只需将调用包装到parse()等效的try / catch-block中即可处理非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()可能是最不适合的方法。
大卫,

0

取决于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

为什么您不能仅检查响应是什么?效率更高。

var result;

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

屏幕1


-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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.