JSON方法可以将对象转换为字符串,并包含重要的属性
得到的 json 字符串是一个被称为 JSON 编码 或 **序列化 **或 字符串化 或 编组化(marshalled) 的对象
JSON 编码的对象与对象字面量的区别
字符串使用双引号。JSON 中没有单引号或反引号。所以 'John' 被转换为 "John"。对象属性名称也是双引号的。这是强制性的。所以 age:30 被转换成 "age":30。JSON.stringify也可以用于原始的数据类型
//数字在 JSON 还是数字 console.log(JSON.stringify(1)) //1 //字符串在 JSON 中还是字符串,只是被双引号扩起来 console.log(JSON.stringify('test')) //"test" console.log(JSON.stringify(true)) //true console.log(JSON.stringify([1,2,3])) //[1,2,3]一些特定的JavaScript对象属性会被JSON.stringify忽略
函数属性(方法)。Symbol 类型的属性。存储 undefined 的属性。 let user = { sayHi() { // 被忽略 alert("Hello"); }, [Symbol("id")]: 123, // 被忽略 something: undefined // 被忽略 }; console.log( JSON.stringify(user) ); // {}(空对象)不能有循环引用
let room = { number: 23 }; let meetup = { title: "Group", participants: ["john", "july"] }; meetup.place = room; // meetup 引用了 room room.Group = meetup; // room 引用了 meetup JSON.stringify(meetup); // Error: Converting circular structure to JSONJSON.stringify 的完整语法是:
let json = JSON.stringify(value[, replacer, space])value:要编码的值
replacer:要编码的属性数组或者映射函数
space:用于格式化的空格数量
第二个参数的作用是帮助我们微调替换,比如要过滤掉循环引用,就可以使用到第二个参数
我们传递一个属性数组,那么只有这些属性会被编码
let room = { number: 23 }; let meetup = { title: "Conference", participants: [{name: "John"}, {name: "Alice"}], place: room // meetup 引用了 room }; room.occupiedBy = meetup; // room 引用了 meetup console.log( JSON.stringify(meetup, ['title', 'participants', 'place', 'name', 'number']) ); /* { "title":"Conference", "participants":[{"name":"John"},{"name":"Alice"}], "place":{"number":23} } */除 occupiedBy 以外的所有内容都被序列化了。但是属性的列表有点过长
可以使用一个函数代替数组作为replacer
et room = { number: 23 }; let meetup = { title: "Conference", participants: [{name: "John"}, {name: "Alice"}], place: room // meetup 引用了 room }; room.occupiedBy = meetup; // room 引用了 meetup alert( JSON.stringify(meetup, function replacer(key, value) { alert(`${key}: ${value}`); return (key == 'occupiedBy') ? undefined : value; }));JSON.stringify的第三个参数是优化格式的空格数量
let user = { name: "John", age: 25, roles: { isAdmin: false, isEditor: true } }; alert(JSON.stringify(user, null, 2)); /* 两个空格的缩进: { "name": "John", "age": 25, "roles": { "isAdmin": false, "isEditor": true } } */space = 2 的作用是告诉JavaScript在多行中显示嵌套的对象,对象内部缩进2个空格
对象可以提供 toJSON 方法来进行 JSON 转换,JSON.stringify 会自动调用它。
let room = { number: 23, toJSON() { return this.number; } }; let meetup = { title: "Conference", room }; alert( JSON.stringify(room) ); // 23 alert( JSON.stringify(meetup) ); /* { "title":"Conference", "room": 23 } */toJSON 可用于直接调用 JSON.stringify(room),也可以当作room嵌套在另一个编码对象中
用来对JSON字符串进行解码
let value = JSON.parse(str, [reviver]);str:要解析的 JSON 字符串
reviver:可选函数,该函数将为每个 (key, value) 对调用,并可以对值进行转换。
// 字符串化数组 let numbers = "[0, 1, 2, 3]"; numbers = JSON.parse(numbers); console.log( numbers[1] ); // 1嵌套对象
let userData = '{ "name": "John", "age": 35, "isAdmin": false, "friends": [0,1,2,3] }'; let user = JSON.parse(userData); alert( user.friends[1] ); // 1JSON 不支持注释。向 JSON 添加注释无效。