1

我正在使用这个函数来测试 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?

4

3 回答 3

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.

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

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

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

去测试:

> JSON.parse('["thing1","thing2","thing3"]')
["thing1", "thing2", "thing3"]
于 2013-02-26T15:56:47.117 回答
1

我认为这与您所说的相反:在 jQuery/1.8 中,它没有按您的预期工作,因为无效的 JSON 字符串会生成$.parseJSON()return null。然而,在 jQuery/1.9 中它确实会抛出异常。

根据API 文档

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

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

于 2013-02-26T15:58:12.323 回答
1

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

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

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

现在,有趣的是 1.8.3 并没有那样做,我承认。研究时间...

好的,在 1.9 之前,$.parseJSON()代码将快速返回null非字符串参数值。现在,JSON.parse()如果可用,它会很快地推迟到本机,并且由于这会在非字符串、非空参数上引发错误,因此您现在会得到异常。

于 2013-02-26T15:51:58.347 回答