1.5.1 JSON.parse()
优质
小牛编辑
136浏览
2023-12-01
JSON的本质是一个字符串,它之所以受欢迎,是因为可以把JSON字符串解析为有用的JavaScript对象。
ECMAScript5中,对解析JSON的行为进行了规范,并定义了一个全局对象JSON,该对象有两个方法:JSON.parse() 和 JSON.stringify()。
JSON.parse()
JSON.parse() 方法,用于把JSON字符串转换为原生的 JavaScript 值或对象。如:
JSON.parse('1') // 1
JSON.parse('{}') // {}
JSON.parse('true') // true
JSON.parse('"foo"') // "foo"
JSON.parse('[1, 5, "false"]') // [1, 5, "false"]
JSON.parse('null') // null
var o = JSON.parse('{"name": "张三"}');
o.name // 张三
如果传递给JSON.parse()方法的字符串不是有效的JSON格式,JSON.parse()方法将报错。如:
JSON.parse("'String'")
//Uncaught SyntaxError: Unexpected token u in JSON at position 0(…)
JSON.parse("undefined")
//Uncaught SyntaxError: Unexpected token u in JSON at position 0(…)
除了直接进行字符串转换之外,JSON.parse()方法也可以接收一个函数参数,该函数被称为还原函数。如果提供还原函数,则对象的每个成员都会调用这个函数。
还原函数接收两个参数,一个键和一个值,并返回一个值。如果还原函数返回undefined,则表示要从结果中删除相应的键;如果返回其他值,则将该值插入到结果中。如:
var o = JSON.parse('{"a":1,"b":2}', function(key, value) {
if (key === ''){
return value;
}
if (key === 'a') {
return value + 10;
}
});
o.a // 11
o.b // undefined
JSON 不能存储 Date 对象。如果你需要存储 Date 对象,需要将其转换为字符串,之后再将字符串转换为 Date 对象。在将日期字符串转换为Date对象时,经常要用到还原函数。如:
var book = {
"title": "javascript",
"date": new Date(2018,1,21)
}
var jsonStr = JSON.stringify(book);
console.log(jsonStr)
//'{"title":"javascript","date":"2018-02-20T16:00:00.000Z"}'
var bookCopy = JSON.parse(jsonStr,function(key,value){
if(key == 'date'){
return new Date(value);
}
return value;
})
console.log(bookCopy.date.getFullYear()); //2018
说明:JSON.parse() 和 eval()
实际上,eval() 函数的功能类似于 JSON.parse()方法,也可以将json字符串转换为json对象。如:
eval('(' + '{"a":1}'+')').a; //1
JSON.parse('{"a":1}').a; //1
但是,eval() 函数可以执行不符合 JSON 格式的代码。如:
eval('(' + '{"a":alert(1)}'+')').a; //弹出1
JSON.parse('{"a":alert(1)}').a; //报错
在浏览器中运行上述代码,eval() 函数就会弹出 alert 框,而 JSON.parse()方法将会报错。由于 eval() 函数会为恶意代码提供可乘之机,因此应当尽量少使用 eval() 函数,而是使用更安全的 JSON.parse()方法。