给定一个JSON数据字符串,如何安全地将该字符串转换为JavaScript对象?
很明显,我可以用这样的方式来做这件事:
var obj = eval("(" + json + ')');
但这让我很容易受到包含其他代码的JSON字符串的攻击,简单地eval似乎非常危险。
给定一个JSON数据字符串,如何安全地将该字符串转换为JavaScript对象?
很明显,我可以用这样的方式来做这件事:
var obj = eval("(" + json + ')');
但这让我很容易受到包含其他代码的JSON字符串的攻击,简单地eval似乎非常危险。
当前回答
我知道,老问题是,但是没有人注意到这个解决方案,因为它使用了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元素(例如数据属性)的配置设置。
其他回答
使用JSON.Parse()解析JSON字符串,数据将成为JavaScript对象:
JSON.parse(jsonString)
这里,JSON表示处理JSON数据集。
想象一下,我们从web服务器收到了以下文本:
'{ "name":"John", "age":30, "city":"New York"}'
要解析为JSON对象,请执行以下操作:
var obj = JSON.parse('{ "name":"John", "age":30, "city":"New York"}');
这里obj是相应的JSON对象,看起来像:
{ "name":"John", "age":30, "city":"New York"}
要获取值,请使用。操作员:
obj.name // John
obj.age //30
使用JSON.stringify()将JavaScript对象转换为字符串。
使用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);
为了好玩,这里有一种使用函数的方法:
jsonObject = (new Function('return ' + jsonFormatData))()
$.ajax({
url: url,
dataType: 'json',
data: data,
success: callback
});
回调传递返回的数据,该数据将是JSON结构定义的JavaScript对象或数组,并使用$.parseJSON()方法进行解析。
我不确定是否有其他方法可以做到这一点,但以下是在Prototype(JSON教程)中如何做到的。
new Ajax.Request('/some_url', {
method:'get',
requestHeaders: {Accept: 'application/json'},
onSuccess: function(transport){
var json = transport.responseText.evalJSON(true);
}
});
使用true作为参数调用evalJSON()将净化传入字符串。