概述
- JSON是一种数据交换的文本格式,每个JSON对象就是一个值,可能是一个数组或对象,也可能是一个原始值。
- JSON值类型和格式规定:
- 引用值只能是
对象或数组,不能是函数、正则、日期对象。
- 原始值只有四种
number(只能是十进制)、string、boolean、null。undefined、NaN、Infinity都是非法的。
- 字符串只能使用
双引号,不允许使用单引号。
- 对象的
键名只能放在双引号里。
- 数组或对象的
最后一个成员后面不能加逗号。
["one", "two", "three"]
{ "one": 1, "two": 2, "three": 3 }
{"names": ["张三", "李四"] }
[ { "name": "张三"}, {"name": "李四"} ]
{ name: "张三", 'age': 32 }
[32, 64, 128, 0xFFF]
{ "name": "张三", "age": undefined }
{ "name": "张三",
"birthday": new Date('Fri, 26 Aug 2011 07:13:10 GMT'),
"getName": function () {
return this.name;
}
}
JSON.stringify()
JSON.stringify('abc')
JSON.stringify(1)
JSON.stringify(false)
JSON.stringify([])
JSON.stringify({})
var obj = { name: undefined }
JSON.stringify(obj)
var arr = [undefined, 1, 2]
var obj = {};
Object.defineProperties(obj, {
'foo': {
value: 1,
enumerable: true
},
'bar': {
value: 2,
enumerable: false
}
});
JSON.stringify(obj);
- 第二个参数:
- 接受一个
数组,指定对象的哪些属性需要转成字符串,对数组无效。
- 也可以是一个
函数,参数为键名和键值,用来更改此方法的返回值。
var obj = {a: 1, b: 2, c: 3}
JSON.stringify(obj, ['a', 'b'])
function f(key, value) {
if (typeof value === "number") {
value = 2 * value;
}
return value;
}
JSON.stringify({ a: 1, b: 2 }, f)
对象的toJSON()与JSON.stringify()
- 如果参数对象有自定义的
toJSON(),那么JSON.stringify()会使用这个方法的返回值作为参数,而忽略原对象的其他属性。
var obj = {
a: 1,
b: 2,
toJSON: function(){
return this.a + this.b;
}
}
JSON.stringify(obj)
JSON.parse()
JSON.parse('{}')
JSON.parse('[]')
JSON.parse('true')
JSON.parse('[1, 5, "false"]')
JSON.parse('null')
var o = JSON.parse('{"name": "张三"}');
o.name
JSON.parse('"foo"')
JSON.parse("'foo'")
深拷贝
var obj = {
name: '张三',
family: {
wife: '李四'
}
}
var newObj = JSON.parse(JSON.stringify(obj))
obj.family.wife = '王五'
obj.family.wife
newObj.family.wife