目录
当前位置: 首页 > 文档资料 > JSON 教程 >

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()方法。