你如何在jQuery 1.9.1中使用$ .parseJSON?

我正在使用此函数来测试JSON对象的有效性:

function is_JSON( test ) { try { var c = $.parseJSON( test ); } catch (e) { return false; } return true; } 

你可以看到它在这里工作得很好,使用jQuery 1.8.3 …

http://jsfiddle.net/xZYVY/

…但是如果你切换到jQuery 1.9.1,这不起作用!

http://jsfiddle.net/xZYVY/1/

我错过了什么? 有没有更好的方法来测试有效的JSON?

这部分代码:

 var test = ['thing1','thing2','thing3']; 

创建一个数组而不是包含有效JSON表达式的字符串。 它似乎与1.8.3 一起工作的原因是因为当时parseJSON看起来像这样:

 function( data ) { if ( !data || typeof data !== "string") { return null; } // ... } 

如您所见,如果您将数组作为第一个参数传递,它将返回null ; 它不会抛出exception。

然后你的函数返回true

 parseJSON: function is_JSON( test ) { try { var c = $.parseJSON( test ); } catch (e) { return false; } // c === null return true; } 

从1.9开始,这就是parseJSON样子:

 parseJSON: function( data ) { // Attempt to parse using the native JSON parser first if ( window.JSON && window.JSON.parse ) { return window.JSON.parse( data ); } if ( data === null ) { return data; } if ( data === null ) { return data; } // etc. 

如果传递的参数不是有效的JSON表达式, window.JSON.parse()将抛出exception。

一个有效的表达式是这样的:

 '["thing1","thing2","thing3"]' 

去测试:

 > JSON.parse('["thing1","thing2","thing3"]') ["thing1", "thing2", "thing3"] 

我认为这与你说的相反:在jQuery / 1.8中它没有按预期工作,因为无效的JSON字符串使$.parseJSON()返回null 。 但是,在jQuery / 1.9中它会引发exception。

根据API文档 :

传入格式错误的JSON字符串可能会导致抛出exception

所以你不能依赖那种行为。 您还需要测试返回值。

您的“test”变量根本不是有效的JSON字符串; 它是一个JavaScript数组。

这是一个固定版本,其中值是JSON字符串。

  var test = '["thing1","thing2","thing3"]'; 

现在,有趣的是,1.8.3不会这样做,我承认。 研究时间……

好的,在1.9之前, $.parseJSON()代码会很快为非字符串参数值返回null 。 现在,它就像快速推迟使用本机JSON.parse() ,并且因为它会在非字符串,非空参数上抛出错误,所以现在就会得到exception。