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

很明显,我可以用这样的方式来做这件事:

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

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


当前回答

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

这个答案已经过时,Jonathan上面的答案(JSON.parse(jsonString))现在是最好的答案。

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

其他回答

这似乎是一个问题:

通过Ajax websocket等接收的输入,它将是字符串格式,但您需要知道它是否是JSON.parsable。问题是,如果您始终通过JSON.parse运行它,程序可能会“成功”继续运行,但您仍然会看到控制台中抛出一个错误,显示可怕的“错误:意外标记'x'”。

var data;

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

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

我不确定是否有其他方法可以做到这一点,但以下是在Prototype(JSON教程)中如何做到的。

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

使用true作为参数调用evalJSON()将净化传入字符串。

您也可以使用reviver函数进行过滤。

var data = JSON.parse(jsonString, function reviver(key, value) {
   //your code here to filter
});

有关详细信息,请阅读JSON.parse。

为了好玩,这里有一种使用函数的方法:

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

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

let jsonObject = JSON.parse(jsonString);

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

如果您使用jQuery,只需使用:

jQuery.parseJSON( jsonString );

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