浏览器本机JSON支持(window.JSON)


Answers:


108

所有现代浏览器均支持本地JSON编码/解码(Internet Explorer 8 +,Firefox 3.1 +,Safari 4+和Chrome 3+)。基本上,JSON.parse(str)将解析JSON字符串str并返回一个对象,并将返回该对象JSON.stringify(obj)的JSON表示形式obj

有关MDN文章的更多详细信息。


我知道支持并不广泛,但是使用此方法应该比对字符串进行eval()更快,更安全,所以我想在可用的地方使用它。关于其他浏览器支持的想法吗?
levik

17
哦,还有一点要注意,千万不要使用eval()JSON字符串。相反,请使用许多可用的JSON解析库之一。
Sasha Chedygov

1
@colbeerhey:是的,这是我最常看到的那个。您也可以窃取jQuery。
Sasha Chedygov

2
作为参考,当您说“ NEVER eval()...”,然后提到json2是广受支持的库时,值得注意的是它确实使用eval,但它首先尝试使用正则表达式来验证字符串。尽管有些解析器无法以可比的性能进行验证,但这比验证和解析字符串要快。json2.js可能仍然是最好的选择,尽管仅仅是因为它无处不在。
TheXenocide 2011年

2
@TheXenocide:好点,但是它的作者可能在验证代码上花了很多时间,所以我说永远不要使用eval()JSON字符串,因为您将重新发明轮子,并且很可能会弄错它。
Sasha Chedygov 2011年

30

jQuery-1.7.1.js-555行...

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

    // Make sure leading/trailing whitespace is removed (IE can't handle it)
    data = jQuery.trim( data );

    // Attempt to parse using the native JSON parser first
    if ( window.JSON && window.JSON.parse ) {
        return window.JSON.parse( data );
    }

    // Make sure the incoming data is actual JSON
    // Logic borrowed from http://json.org/json2.js
    if ( rvalidchars.test( data.replace( rvalidescape, "@" )
        .replace( rvalidtokens, "]" )
        .replace( rvalidbraces, "")) ) {

        return ( new Function( "return " + data ) )();

    }
    jQuery.error( "Invalid JSON: " + data );
}





rvalidchars = /^[\],:{}\s]*$/,

rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,

rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,

rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,

4
真好 使用jQuery的好参数。
OneWorld '07

11
更像是要在jQuery内部查看的参数=)
Olga 2013年

13

使用json2.js的优点是,只有在浏览器还没有解析器的情况下,它才会安装解析器。您可以保持与旧版浏览器的兼容性,但是可以使用本机JSON解析器(更安全,更快速)。

使用本机JSON的浏览器:

  • IE8 +
  • Firefox 3.1+
  • Safari 4.0.3+
  • Opera 10.5+

G。


10

[扩展musicfreak评论]

如果您使用的是jQuery,请使用parseJSON

var obj = jQuery.parseJSON(data)

在内部,它检查浏览器是否支持.JSON.parse,并(如果可用)调用本机window.JSON.parse。

如果不是,则自行解析。


8

为了使使用此线程的任何人受益-有关支持JSON对象的最新的,确定的浏览器列表,请单击此处。。一个简短的通用答案-几乎所有在2013年以上才真正重要的浏览器。

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.