给定一个JSON数据字符串,如何安全地将该字符串转换为JavaScript对象?
很明显,我可以用这样的方式来做这件事:
var obj = eval("(" + json + ')');
但这让我很容易受到包含其他代码的JSON字符串的攻击,简单地eval似乎非常危险。
给定一个JSON数据字符串,如何安全地将该字符串转换为JavaScript对象?
很明显,我可以用这样的方式来做这件事:
var obj = eval("(" + json + ')');
但这让我很容易受到包含其他代码的JSON字符串的攻击,简单地eval似乎非常危险。
当前回答
JSON解析总是一个难题。如果输入不符合预期,则会抛出错误并使您正在执行的操作崩溃。
您可以使用下面的小函数来安全地解析输入。即使输入无效或已经是一个对象,它也始终会转换对象,这在大多数情况下更好:
JSON.safeParse = function (input, def) {
// Convert null to empty object
if (!input) {
return def || {};
} else if (Object.prototype.toString.call(input) === '[object Object]') {
return input;
}
try {
return JSON.parse(input);
} catch (e) {
return def || {};
}
};
其他回答
我不确定是否有其他方法可以做到这一点,但以下是在Prototype(JSON教程)中如何做到的。
new Ajax.Request('/some_url', {
method:'get',
requestHeaders: {Accept: 'application/json'},
onSuccess: function(transport){
var json = transport.responseText.evalJSON(true);
}
});
使用true作为参数调用evalJSON()将净化传入字符串。
JSON.parse(jsonString);
json.parse将变为object。
这个答案适用于IE<7,对于现代浏览器,请查看上面Jonathan的答案。
这个答案已经过时,Jonathan上面的答案(JSON.parse(jsonString))现在是最好的答案。
JSON.org有多种语言的JSON解析器,包括四种不同的JavaScript解析器。我相信大多数人都会考虑将json2.js作为他们的goto实现。
将对象转换为JSON,然后解析它,对我来说很有用,比如:
JSON.parse(JSON.stringify(object))
我知道,老问题是,但是没有人注意到这个解决方案,因为它使用了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元素(例如数据属性)的配置设置。