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

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

显然,我可以通过以下方式不安全地执行此操作:

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

但这使我容易受到包含其他代码的 JSON 字符串的影响,仅进行评估似乎很危险。

答案

JSON.parse(jsonString)是一种纯 JavaScript 方法,只要您可以保证使用合理的现代浏览器即可。

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

let jsonObject = JSON.parse(jsonString);

使用不推荐使用的 jQuery 功能的原始答案

如果您使用的是 jQuery,请使用:

jQuery.parseJSON( jsonString );

正是您要找的东西(请参阅 jQuery 文档 )。

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

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

JSON.org具有用于多种语言的 JSON 解析器,包括用于 JavaScript 的四种不同语言。我相信大多数人都会将json2.js视为其 goto 实现。

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

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

并反转:

var str = JSON.stringify(arr);

我不确定其他实现方法,但是这是您在Prototype(JSON 教程)中的实现方法

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

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

这似乎是问题所在:

通过 Ajax websocket 等接收的输入,它将采用 String 格式,但是您需要知道它是否为JSON.parsable 。麻烦的是,如果您始终通过JSON.parse运行它,则程序可以 “成功” 继续运行,但是您仍然会在控制台中看到一个可怕的"Error: unexpected token 'x'"引发的"Error: unexpected token 'x'"

var data;

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

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

如果您使用的是jQuery ,则还可以使用:

$.getJSON(url, function(data) { });

然后你可以做类似的事情

data.key1.something
data.key1.something_else

等等

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

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

只是为了好玩,这是使用函数的一种方式:

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

尝试将此方法与此 Data 对象一起使用。例如: Data='{result:true,count:1} '

try {
  eval('var obj=' + Data);
  console.log(obj.count);
}
catch(e) {
  console.log(e.message);
}

当您进行串行端口编程时,此方法确实对 Node.js 有帮助