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


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

很显然,你可以通过以下方式不安全地做到这一点......

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

...但是这使得我们容易受到包含其他代码的json字符串的影响,这对于简单的eval来说似乎非常危险。


1130
2017-09-05 00:12


起源


在大多数语言中,eval会带来额外的风险。 Eval留下了一扇敞开的大门,被黑客利用。但是,请记住,所有javascript都在客户端上运行。 期望 它会被黑客改变。他们可以通过使用控制台来评估他们想要的任何东西。您必须在服务器端构建保护。 - Beachhouse
好的,现在是2014年,你永远不应该使用 eval 为了解析JSON字符串,因为您将代码暴露给“代码注入”。使用 JSON.parse(yourString) 代替。 - Daniel
JSON数据是文字吗? - shanechiu


答案:


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


1704
2018-04-16 11:45



我很确定它对Node.js来说是安全的 - Stephen
@vsync你确实意识到这就是了 只要 纯Javascript答案...如果你阅读了javascript标签的描述,你会看到这个...“除非还包含框架/库的标记,否则需要纯JavaScript答案。“我给这个 +1 作为唯一的JavaScript答案... - iConnor
使用起来非常安全。 - Redsandro
如果你正在做NodeJS,我无法加载jQuery只是为了将jsonString解析为JSON对象。所以赞成乔纳森的回答 - Antony
根据 这个链接 IE8 +支持它,虽然它说: Requires document to be in IE8+ standards mode to work in IE8. - JoshuaDavid


现在不推荐使用jQuery方法。请改用此方法:

let jsonObject = JSON.parse(jsonString);

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

如果您正在使用jQuery,请使用:

jQuery.parseJSON( jsonString );

这正是你要找的东西(参见jQuery 文件)。


856
2017-09-02 14:07



有没有理由在JSON.parse()上使用它? - Frank
jQuery.parseJSON 默认使用 JSON.parse 如果它存在,那么使用它而不是真实的唯一理由是,如果你需要一个<IE7的后备。它在jQuery 1.6中改变了: james.padolsey.com/jquery/#v=1.6.0&fn=jQuery.parseJSON - Karl-Johan Sjögren
2016更新:自jQuery 3.0起, $ .parseJSON 不推荐使用,您应该使用原生JSON.parse方法。 - jkdev


编辑:这个答案适用于IE <7,现代浏览器检查Jonathan的答案。

编辑:这个答案已经过时了 乔纳森的回答如上 (JSON.parse(jsonString))现在是 最佳答案

JSON.org 有许多语言的JSON解析器,包括4个不同的Javascript语言。我相信大多数人都会考虑 json2.js 他们的goto实现。


138
2017-09-05 00:13



我希望人们停止投票给这个答案。它在2008年发布时是准确的。只需投票给新的。 - John
如果答案现已过时,请考虑更新答案。 - Sotirios Delimanolis
对于IE <8,你需要使用它。 - Mahmoodvcs


使用下面表示的简单代码 MSDN上的链接

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

并反转

var str = JSON.stringify(arr);

61
2017-12-15 23:26



请努力引用英语链接(对于我们的国际观众)...喜欢 msdn.microsoft.com/en-us/en-uk/library/ie/... - MikeD


我不确定其他方法,但这是你如何做到这一点 原型(JSON教程)

new Ajax.Request('/some_url', {
  method:'get',
  requestHeaders: {Accept: 'application/json'},
  onSuccess: function(transport){
    var json = transport.responseText.evalJSON(true);
  }
});

调用 evalJSON() 使用true作为参数清理传入的字符串。


17
2017-09-05 00:13





这似乎是个问题:

通过ajax websocket等接收输入,它总是以String格式 - 但你需要知道它是否是JSON.parsable。 Touble是,如果你总是通过JSON.parse运行它,程序可以继续“成功”但你仍然会看到控制台中出现的错误,其中包含可怕的“错误:意外标记'x'”。

var data;

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

data || (data = {
  message: 'Server error, please retry'
});

15
2018-04-29 07:37



没有。问题是你期待一个JSON对象,并可能最终得到 (function(){ postCookiesToHostileServer(); }()); 在Node的上下文中甚至是更糟糕的东西。 - Yaur
好吧,JSON.parse会擦除函数的输入(在这种情况下,它不会作为一个IIF - >对象帮助)。看来这个主题的最佳方式是try / catch。 (见编辑) - Cody


如果你正在使用 jQuery的,你也可以这样做 $.getJSON(url, function(data) { });

那你可以做点什么 data.key1.somethingdata.key1.something_else


11
2017-10-24 13:57



你使用的是jQuery,不是吗? - Alexandre C.


$.ajax({
  url: url,
  dataType: 'json',
  data: data,
  success: callback
});

回调传递返回的数据,该数据将是JSON结构定义的JavaScript对象或数组,并使用 $.parseJSON() 方法。


10
2018-05-06 06:23





只是为了好玩,这是使用功能的方式:

 jsonObject = (new Function('return ' + jsonFormatData))()

9
2017-10-15 08:11



有趣的方法,我不确定我是否可以使用JSON.Parse,但很高兴看到有人在盒子外面思考。
这与使用非常相似 eval 这样做并不安全。 :P - Florrie
这具有使用的所有缺点 eval 但是对于维护者来说理解起来更复杂,更难。 - Quentin