给定一个JSON数据字符串,如何安全地将该字符串转换为JavaScript对象?
很明显,我可以用这样的方式来做这件事:
var obj = eval("(" + json + ')');
但这让我很容易受到包含其他代码的JSON字符串的攻击,简单地eval似乎非常危险。
给定一个JSON数据字符串,如何安全地将该字符串转换为JavaScript对象?
很明显,我可以用这样的方式来做这件事:
var obj = eval("(" + json + ')');
但这让我很容易受到包含其他代码的JSON字符串的攻击,简单地eval似乎非常危险。
当前回答
仅针对不同输入类型的封面解析
使用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 + ")");
其他回答
我找到了一个“更好”的方法:
在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'
});
官方文件:
方法解析JSON字符串,构造字符串所描述的JavaScript值或对象。可以提供可选的reviver函数,以便在返回结果对象之前对其执行转换。
语法:
JSON.parse(text[, reviver])
参数:
文本:要解析为JSON的字符串。有关JSON语法的描述,请参见JSON对象。
reviver(可选):如果是函数,这规定了在返回之前如何转换最初通过解析生成的值。
返回值
与给定JSON文本对应的Object。
例外情况
如果要分析的字符串不是有效的JSON,则引发SyntaxError异常。
为了好玩,这里有一种使用函数的方法:
jsonObject = (new Function('return ' + jsonFormatData))()
使用“JSON.parse()”中的简单代码示例:
var jsontext = '{"firstname":"Jesper","surname":"Aaberg","phone":["555-0100","555-0120"]}';
var contact = JSON.parse(jsontext);
并将其反转:
var str = JSON.stringify(arr);
我知道,老问题是,但是没有人注意到这个解决方案,因为它使用了new Function(),一个返回数据的匿名函数。
举个例子:
var oData = 'test1:"This is my object",test2:"This is my object"';
if( typeof oData !== 'object' )
try {
oData = (new Function('return {'+oData+'};'))();
}
catch(e) { oData=false; }
if( typeof oData !== 'object' )
{ alert( 'Error in code' ); }
else {
alert( oData.test1 );
alert( oData.test2 );
}
这稍微安全一点,因为它在函数内部执行,而不直接在代码中编译。因此,如果其中有函数声明,它将不会绑定到默认的窗口对象。
我使用它来简单快速地“编译”DOM元素(例如数据属性)的配置设置。