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

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

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

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


当前回答

这似乎是一个问题:

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

var data;

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

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

其他回答

摘要:

Javascript(浏览器和NodeJS)有一个内置的JSON对象。在这个Object上有两种处理JSON的方便方法。它们如下:

JSON.parse()将JSON作为参数,返回JS对象JSON.stringify()将JS对象作为参数返回JSON对象

其他应用:

除了非常方便地处理JSON之外,它们还可以用于其他方式。两种JSON方法的结合使我们可以非常容易地制作数组或对象的深度克隆。例如:

设arr1=[1,2,[3,4]];让newArr=arr1.slice();arr1[2][0]=“已更改”;console.log(newArr);//不是深度克隆设arr2=[1,2,[3,4]];让newArrDeepclon=JSON.parse(JSON.stringify(arr2));arr2[2][0]=“已更改”;console.log(newArrDeepclone);//深度克隆,值不变

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

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

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

使用parse()方法的最简单方法:

var response = '{"result":true,"count":1}';
var JsonObject= JSON.parse(response);

然后可以获得JSON元素的值,例如:

var myResponseResult = JsonObject.result;
var myResponseCount = JsonObject.count;

使用jQuery.parseJSON()文档中描述的jQuery:

JSON.parse(jsonString);

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

使用JSON.parse可能是最好的方法。

这里有一个例子

var jsonRes = '{ "students" : [' +
          '{ "firstName":"Michel" , "lastName":"John" ,"age":18},' +
          '{ "firstName":"Richard" , "lastName":"Joe","age":20 },' +
          '{ "firstName":"James" , "lastName":"Henry","age":15 } ]}';
var studentObject = JSON.parse(jsonRes);