给定一个JSON数据字符串,如何安全地将该字符串转换为JavaScript对象?
很明显,我可以用这样的方式来做这件事:
var obj = eval("(" + json + ')');
但这让我很容易受到包含其他代码的JSON字符串的攻击,简单地eval似乎非常危险。
给定一个JSON数据字符串,如何安全地将该字符串转换为JavaScript对象?
很明显,我可以用这样的方式来做这件事:
var obj = eval("(" + json + ')');
但这让我很容易受到包含其他代码的JSON字符串的攻击,简单地eval似乎非常危险。
当前回答
在JavaScript中解析JSON的推荐方法是使用JSON.parse()
出身背景
JSON API是在ECMAScript 5中引入的,目前已在99%以上的浏览器中实现(按市场份额)。
jQuery曾经有一个$.parseJSON()函数,但在jQuery 3.0中已弃用。无论如何,在很长一段时间里,它只是JSON.parse()的包装器。
实例
const json=“{”城市“:”波士顿“,”人口“:500000}”;const object=JSON.parse(JSON);console.log(object.city,object.population);
浏览器兼容性
所有主要浏览器都支持JSON.parse吗?
差不多,是的(见参考资料)。
其他回答
另一种选择
const json=“{”水果“:”菠萝“,”手指“:10}”让j0s,j1s,j2s,j3sconsole.log(`{“${j0s=“fruit”}”:“${j1s=“菠萝”}”,“${j2s=“fingers”}”:${j3s=“10”}}`)
我不确定是否有其他方法可以做到这一点,但以下是在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()解析数据,数据将成为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 + ")");
如果我们有这样的字符串:
"{\"status\":1,\"token\":\"65b4352b2dfc4957a09add0ce5714059\"}"
那么我们可以简单地使用JSON.parse两次将该字符串转换为JSON对象:
var sampleString = "{\"status\":1,\"token\":\"65b4352b2dfc4957a09add0ce5714059\"}"
var jsonString= JSON.parse(sampleString)
var jsonObject= JSON.parse(jsonString)
我们可以使用以下方法从JSON对象中提取值:
// instead of last JSON.parse:
var { status, token } = JSON.parse(jsonString);
结果将是:
status = 1 and token = 65b4352b2dfc4957a09add0ce5714059
这似乎是一个问题:
通过Ajax websocket等接收的输入,它将是字符串格式,但您需要知道它是否是JSON.parsable。问题是,如果您始终通过JSON.parse运行它,程序可能会“成功”继续运行,但您仍然会看到控制台中抛出一个错误,显示可怕的“错误:意外标记'x'”。
var data;
try {
data = JSON.parse(jqxhr.responseText);
} catch (_error) {}
data || (data = {
message: 'Server error, please retry'
});