【发布时间】:2010-08-26 11:56:29
【问题描述】:
要解析 JSON,我认为最好的方法是在浏览器中使用原生 JSON 支持。
我一直在寻找一种在原生 JSON 支持不可用的情况下解析 JSON 的好方法。
当我查看https://github.com/douglascrockford/JSON-js/blob/master/json2.js 中的代码时,我的理解是它首先使用正则表达式检查数据是否是有效的 JSON:
if (/^[\],:{}\s]*$/.
test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@').
replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').
replace(/(?:^|:|,)(?:\s*\[)+/g, '')))
然后应用 eval()。
jQuery 首先使用上面的正则表达式执行 $.parseJSON() 来检查它是否是有效的 JSON,然后应用:
return window.JSON && window.JSON.parse ?
window.JSON.parse( data ) :
(new Function("return " + data))();
如果原生 JSON 可用,则使用它,否则使用“新函数”。
我在其他任何地方都找不到关于使用函数对象解析 JSON 的信息。哪个是更好的方法 - 使用 eval() 或函数对象?你能解释一下(new Function("return " + data))();到底是做什么的吗?
【问题讨论】:
-
如果可用,请始终使用本机实现。
-
我想知道如果本地实现不可用如何解析 JSON
-
请注意,jQuery 的
parseJSON是不安全的,因为它无法转义字符 U+2028 和 U+2029,这些字符在 JavaScript 中是行分隔符,但在 JSON 中是有效的原始字符(一个相当糟糕的设计) .parseJSON('"hello\u2028!"');在没有原生 JSON 的浏览器上会失败。json2.js记得在上一步中转义它们。
标签: javascript jquery json eval function-object