2009-05-21 88 views
87

我已经看到了一些浏览器通过window.JSON对象安全有效地支持JSON解析/序列化对象的引用,但细节很难实现。任何人都可以指出正确的方向吗?这个Object暴露的方法是什么?它支持哪些浏览器?浏览器原生JSON支持(window.JSON)

+8

有关本机支持[JSON对象](http://ecma262-5.com/ELS5_Section_15)的浏览器信息,请参见[何时可以使用JSON解析?](http://caniuse.com/json)。 HTM#Section_15.12)。 – outis 2011-12-26 09:38:21

回答

104

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

有关MDN article的更多详细信息。

+0

我知道支持并不普遍,但使用这种方法应该比eval()更快更安全,因此我想在可用的地方使用它。任何想法支持其他浏览器? – levik 2009-05-21 03:53:50

+0

我没有说不使用它,我说不要指望它。肯定检查它是否可用(在这一点上只有IE8和少数Fx Beta用户)并使用它,但我只是说你不应该假设浏览器支持它。到目前为止,这两个是唯一支持它的浏览器,WebKit现在正在开发它,所以很快就可能会在Google Chrome和Safari中使用它。 – 2009-05-21 04:00:25

12

使用json2.js的优点是,如果浏览器还没有安装解析器,它将只安装一个解析器。您可以保持与旧浏览器的兼容性,但如果可用,则使用本机JSON解析器(它更安全,速度更快)。

浏览器与本机JSON:

  • IE8 +
  • 火狐3.1+
  • 的Safari 4.0.3+
  • 歌剧10.5+

G.

10

[延伸musicfreak评论]

如果您正在使用jQuery,使用parseJSON

var obj = jQuery.parseJSON(data) 

内部,它会检查,如果浏览器支持.JSON.parse,以及(如果可用)调用本地window.JSON.parse。

如果不是,解析自己。

29

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, 
8

对于任何人的谁运行到这个线程的好处 - 为浏览器的跟上时代的,明确的清单支持JSON对象look here.。一个简短的通用答案 - 几乎所有浏览器在2013+年都非常重要。