JS笔记《JSON对象》

104 阅读2分钟

概述

  • JSON是一种数据交换的文本格式,每个JSON对象就是一个值,可能是一个数组或对象,也可能是一个原始值。
  • JSON值类型和格式规定:
    • 引用值只能是对象数组,不能是函数、正则、日期对象。
    • 原始值只有四种number(只能是十进制)、string、boolean、nullundefined、NaN、Infinity都是非法的。
    • 字符串只能使用双引号,不允许使用单引号
    • 对象的键名只能放在双引号里。
    • 数组或对象的最后一个成员后面不能加逗号
["one", "two", "three"]  // 合法
{ "one": 1, "two": 2, "three": 3 }  // 合法
{"names": ["张三", "李四"] }  // 合法
[ { "name": "张三"}, {"name": "李四"} ]  // 合法

{ name: "张三", 'age': 32 }  // 非法!属性名必须使用双引号
[32, 64, 128, 0xFFF] // 非法!不能使用十六进制值
{ "name": "张三", "age": undefined } // 非法!不能使用 undefined

{ "name": "张三",
  "birthday": new Date('Fri, 26 Aug 2011 07:13:10 GMT'),
  "getName": function () {
      return this.name;
  }
} // 非法!属性值不能使用函数和日期对象

JSON.stringify()

  • 将一个值转为JSON字符串。
JSON.stringify('abc') // ""abc""
JSON.stringify(1) // "1"
JSON.stringify(false) // "false"
JSON.stringify([]) // "[]"
JSON.stringify({}) // "{}"

var obj = { name: undefined }
JSON.stringify(obj)  // '{}' 对象的值如果是undefined 会被忽略

var arr = [undefined, 1, 2]  // '[null,1,2]' 数组的值如果是undefined 会被转为 null

var obj = {};
Object.defineProperties(obj, {
  'foo': {
    value: 1,
    enumerable: true
  },
  'bar': {
    value: 2,
    enumerable: false
  }
});
JSON.stringify(obj); // "{"foo":1}"  不可遍历的属性会被此方法忽略
  • 第二个参数:
    • 接受一个数组,指定对象的哪些属性需要转成字符串,对数组无效。
    • 也可以是一个函数,参数为键名和键值,用来更改此方法的返回值
// 数组
var obj = {a: 1, b: 2, c: 3}
JSON.stringify(obj, ['a', 'b'])  // '{"a":1,"b":2}'

// 函数
function f(key, value) {
  if (typeof value === "number") {
    value = 2 * value;
  }
  return value;
}

JSON.stringify({ a: 1, b: 2 }, f)  // '{"a": 2,"b": 4}'

对象的toJSON()与JSON.stringify()

  • 如果参数对象有自定义的toJSON(),那么JSON.stringify()会使用这个方法的返回值作为参数,而忽略原对象的其他属性
var obj = {
  a: 1,
  b: 2,
  toJSON: function(){
    return this.a + this.b;
  }
}
JSON.stringify(obj)  // '3'

JSON.parse()

  • 将JSON字符串转成对应的值。
JSON.parse('{}') // {}
JSON.parse('[]') // []
JSON.parse('true') // true
JSON.parse('[1, 5, "false"]') // [1, 5, "false"]
JSON.parse('null') // null

var o = JSON.parse('{"name": "张三"}');
o.name  // '张三'

JSON.parse('"foo"') // "foo"
JSON.parse("'foo'") // 报错  Unexpected token ''', "'foo'" is not valid JSON
// 单引号字符不符合JSON格式,所以报错

深拷贝

var obj = {
  name: '张三',
  family: {
    wife: '李四'
  }
}
var newObj = JSON.parse(JSON.stringify(obj))  // {name: '张三', family: {wife: '李四'}}
obj.family.wife = '王五'
obj.family.wife     // '王五'
newObj.family.wife  // '李四'