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

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

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

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


当前回答

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

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

其他回答

摘要:

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);//深度克隆,值不变

仅针对不同输入类型的封面解析

使用JSON.Parse()解析数据,数据将成为JavaScript对象。

var obj = JSON.parse('{ "name":"John", "age":30, "city":"New York"}');

当对从数组派生的JSON使用JSON.parse()时,该方法将返回JavaScript数组,而不是JavaScript对象。

var myArr = JSON.parse(this.responseText);
console.log(myArr[0]);

JSON中不允许使用日期对象。约会时做这样的事

var text = '{ "name":"John", "birth":"1986-12-14", "city":"New York"}';
var obj = JSON.parse(text);
obj.birth = new Date(obj.birth);

JSON中不允许使用函数。如果需要包含函数,请将其写成字符串。

var text = '{ "name":"John", "age":"function () {return 30;}", "city":"New York"}';
var obj = JSON.parse(text);
obj.age = eval("(" + obj.age + ")");

使用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);

我找到了一个“更好”的方法:

在CoffeeScript中:

try data = JSON.parse(jqxhr.responseText)
data ||= { message: 'Server error, please retry' }

在Javascript中:

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

etc.