我正在使用此函数来测试JSON对象的有效性:
function is_JSON( test ) {
try { var c = $.parseJSON( test );
} catch (e) { return false; }
return true;
}
使用jQuery 1.8.3 ...
,你可以看到它在这里工作得很好...但如果你切换到jQuery 1.9.1,这不起作用!
我错过了什么?有没有更好的方法来测试有效的JSON?
答案 0 :(得分:3)
这部分代码:
var test = ['thing1','thing2','thing3'];
创建一个数组而不是包含有效JSON表达式的字符串。 似乎与1.8.3一起工作的原因是因为当时parseJSON
看起来像这样:
function( data ) {
if ( !data || typeof data !== "string") {
return null;
}
// ...
}
如您所见,如果您将数组作为第一个参数传递,它将返回null
;它没有抛出异常。
然后您的函数返回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()
将抛出异常。
有效的表达式是:
'["thing1","thing2","thing3"]'
测试:
> JSON.parse('["thing1","thing2","thing3"]')
["thing1", "thing2", "thing3"]
答案 1 :(得分:1)
您的“test”变量根本不是有效的JSON字符串;它是一个JavaScript数组。
Here is a fixed version where the value is a JSON string.
var test = '["thing1","thing2","thing3"]';
现在,有趣的是,1.8.3不会这样做,我承认。研究时间......
好的,在1.9之前,$.parseJSON()
代码会很快返回null
非字符串参数值。现在,它就像快速推迟到本机JSON.parse()
一样,并且由于这会在非字符串,非空参数上引发错误,所以现在就会得到异常。
答案 2 :(得分:1)
我认为这与你说的相反:在jQuery / 1.8中,它没有按预期工作,因为无效的JSON字符串使$.parseJSON()
返回null
。但是,在jQuery / 1.9中,它确实会抛出异常。
传入格式错误的JSON字符串可能会导致抛出异常
所以你不能依赖那种行为。您还需要测试返回值。