我正在使用这个函数来测试 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?
我正在使用这个函数来测试 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?
这部分代码:
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.
如果window.JSON.parse()
传递的参数不是有效的 JSON 表达式,则会抛出异常。
一个有效的表达式是这样的:
'["thing1","thing2","thing3"]'
去测试:
> JSON.parse('["thing1","thing2","thing3"]')
["thing1", "thing2", "thing3"]
我认为这与您所说的相反:在 jQuery/1.8 中,它没有按您的预期工作,因为无效的 JSON 字符串会生成$.parseJSON()
return null
。然而,在 jQuery/1.9 中它确实会抛出异常。
根据API 文档:
传入格式错误的 JSON 字符串可能会导致抛出异常
所以你不能依赖这种行为。您还需要测试返回值。
您的“测试”变量根本不是有效的 JSON 字符串;它是一个 JavaScript 数组。
var test = '["thing1","thing2","thing3"]';
现在,有趣的是 1.8.3 并没有那样做,我承认。研究时间...
好的,在 1.9 之前,$.parseJSON()
代码将快速返回null
非字符串参数值。现在,JSON.parse()
如果可用,它会很快地推迟到本机,并且由于这会在非字符串、非空参数上引发错误,因此您现在会得到异常。