浏览器原生 JSON 支持 (window.JSON)
Posted
技术标签:
【中文标题】浏览器原生 JSON 支持 (window.JSON)【英文标题】:Browser-native JSON support (window.JSON) 【发布时间】:2010-10-27 20:07:13 【问题描述】:我看到一些浏览器通过window.JSON
对象安全有效地支持对象的 JSON 解析/序列化,但细节很难获得。谁能指出正确的方向?这个 Object 暴露了哪些方法?支持哪些浏览器?
【问题讨论】:
请参阅When can I use JSON parsing? 以了解有关原生支持JSON object 的浏览器的信息。 【参考方案1】:所有现代浏览器都支持原生 JSON 编码/解码(Internet Explorer 8+、Firefox 3.1+、Safari 4+ 和 Chrome 3+)。基本上JSON.parse(str)
会解析str
中的JSON字符串并返回一个对象,JSON.stringify(obj)
会返回对象obj
的JSON表示。
更多详情请关注MDN article。
【讨论】:
我知道这种支持并不广泛,但使用这种方法应该比 eval() 处理字符串更快、更安全,所以我想在可用的地方使用它。对其他浏览器的支持有任何想法吗? 哦,顺便说一句,永远不要 eval() JSON 字符串。相反,请使用众多可用的 JSON 解析库之一。 @colbeerhey:是的,这是我最常看到的。你也可以窃取 jQuery 的。 作为参考,当您说“NEVER eval() ...”然后提到 json2 是广受支持的库时,值得注意的是它确实使用了 eval,但它会尝试验证字符串首先使用正则表达式。这比验证和解析字符串要快,尽管有些解析器无法以可比的性能进行验证。 json2.js 仍然可能是最好的选择,即使只是因为它的普遍性。 @TheXenocide:说得好,但它的作者可能在验证代码上花了很多时间,所以我说永远不要eval()
JSON 字符串,因为你将重新发明***,你可能会得到错了。【参考方案2】:
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,
【讨论】:
不错。使用 jQuery 的好论据。 更像是一个查看 jQuery 内部的参数 =)【参考方案3】:使用 json2.js 的好处是它只会在浏览器没有解析器的情况下安装解析器。您可以保持与旧浏览器的兼容性,但如果可用,请使用本机 JSON 解析器(更安全、更快)。
具有原生 JSON 的浏览器:
IE8+ 火狐3.1+ Safari 4.0.3+ Opera 10.5+G.
【讨论】:
【参考方案4】:[扩展musicfreak评论]
如果您使用的是 jQuery,请使用 parseJSON
var obj = jQuery.parseJSON(data)
它在内部检查浏览器是否支持 .JSON.parse,并(如果可用)调用本机 window.JSON.parse。
如果不是,则解析自身。
【讨论】:
【参考方案5】:为了任何遇到此线程的人的利益 - 获取支持 JSON 对象 look here. 的最新、明确的浏览器列表。一个简短的通用答案 - 几乎所有在 2013+ 年真正重要的浏览器。
【讨论】:
以上是关于浏览器原生 JSON 支持 (window.JSON)的主要内容,如果未能解决你的问题,请参考以下文章