安全地将 JSON 字符串转换为对象

IT技术 javascript json parsing
2020-12-22 15:43:24

给定一串 JSON 数据,如何安全地将该字符串转换为 JavaScript 对象?

显然,我可以使用以下方法不安全地执行此操作:

var obj = eval("(" + json + ')');

但这让我容易受到包含其他代码的 JSON 字符串的影响,简单地 eval 似乎非常危险。

6个回答

JSON.parse(jsonString) 只要你能保证一个相当现代的浏览器,它就是一种纯 JavaScript 方法。

2021-02-16 15:43:24
根据此链接,它受 IE8+ 支持,尽管它说:Requires document to be in IE8+ standards mode to work in IE8.
2021-02-18 15:43:24
我很确定它对 Node.js 是安全的
2021-02-22 15:43:24
@vsync 你确实意识到这是唯一的纯 Javascript 答案......如果你阅读 javascript 标签的描述,你会看到这个......“除非还包括框架/库的标签,否则纯 JavaScript 答案是预期。 “..我给它一个+1,因为它是唯一的javascript答案......
2021-02-24 15:43:24
如果您正在使用 NodeJS,我无法加载 jQuery 来将 jsonString 解析为 JSON 对象。所以赞成乔纳森的回答
2021-03-09 15:43:24

jQuery 方法现已弃用。请改用此方法:

let jsonObject = JSON.parse(jsonString);

使用已弃用的 jQuery 功能的原始答案

如果您使用 jQuery,请使用:

jQuery.parseJSON( jsonString );

这正是您要寻找的(请参阅 jQuery文档)。

2016 年更新:从 jQuery 3.0 开始,不推荐使用$.parseJSON,您应该改用原生 JSON.parse 方法。
2021-02-14 15:43:24
jQuery.parseJSONJSON.parse如果存在,则默认使用,因此在真实情况下使用它的唯一原因是如果您需要 <IE7 的后备。它在 jQuery 1.6 中发生了变化:james.padolsey.com/jquery/#v=1.6.0&fn=jQuery.parseJSON
2021-02-18 15:43:24
有没有理由在 JSON.parse() 上使用它?
2021-02-26 15:43:24

此答案适用于 IE < 7,对于现代浏览器,请查看上面 Jonathan 的答案。

这个答案已经过时,乔纳森( JSON.parse(jsonString))上面的答案现在是最佳答案

JSON.org有许多语言的 JSON 解析器,包括四种不同的 JavaScript 解析器。我相信大多数人会认为json2.js 是他们的 goto 实现。

我希望人们停止对这个答案投反对票。它在 2008 年发布时是准确的。只需为新的点赞即可。
2021-02-19 15:43:24
如果答案现在已经过时,请考虑更新它。
2021-02-27 15:43:24
对于 IE < 8,您需要使用它。
2021-03-07 15:43:24

使用“ JSON.parse() ”中的简单代码示例

var jsontext = '{"firstname":"Jesper","surname":"Aaberg","phone":["555-0100","555-0120"]}';
var contact = JSON.parse(jsontext);

并扭转它:

var str = JSON.stringify(arr);

这似乎是问题:

通过 Ajax websocket 等接收的输入,它将采用字符串格式,但您需要知道它是否为JSON.parsable. 问题是,如果你总是运行它JSON.parse,程序可能会“成功”继续,但你仍然会在控制台中看到一个错误,带有可怕的"Error: unexpected token 'x'".

var data;

try {
  data = JSON.parse(jqxhr.responseText);
} catch (_error) {}

data || (data = {
  message: 'Server error, please retry'
});
好吧 JSON.parse 擦洗函数的输入(在这种情况下,它无济于事,因为它是一个 IIF --> 对象)。似乎解决这个问题的最好方法是 try/catch。(见编辑)
2021-02-12 15:43:24
不。问题是您期待一个 JSON 对象,并且(function(){ postCookiesToHostileServer(); }());在 Node.js 的上下文中最终可能会出现甚至更讨厌的东西。
2021-02-19 15:43:24