这是我参与8月更文挑战的第20天,活动详情查看: 8月更文挑战
序言
我们经常会在项目中把一些数据转换为JSON,例如存储的时候,以便对象和函数正常保存,这种操作也叫作序列化,或JSON 编码。
JSON.stringify
JavaScript 提供了如下方法:
- JSON.stringify 将对象转换为 JSON。
- JSON.parse 将 JSON 转换回对象。
例如,我们JSON.stringify 一个game 对象
let game = {
sheji: 'CF',
gedou: '拳皇',
logolike: '枪火重生'
};
let json = JSON.stringify(game);
alert(typeof json); // we've got a string!
alert(json);
/* JSON 编码的对象:
{
"sheji": "CF",
"gedou": 拳皇,
"logolike": "枪火重生",
}
*/
方法 JSON.stringify(game) 接收对象并将其转换为字符串。 得到的 json 字符串是一个被称为 JSON 编码(JSON-encoded) 或 序列化(serialized) 或 字符串化(stringified) 或 编组化(marshalled) 的对象。我们现在已经准备好通过有线发送它或将其放入普通数据存储。
JSON 编码的对象与对象字面量有几个重要的区别:
- 字符串使用双引号。JSON 中没有单引号或反引号。所以 'cf' 被转换为 "cf"。
- 对象属性名称也是双引号的。这是强制性的。所以 sheji:"cf"被转换成 "sheji":"cf"。
JSON 支持以下数据类型
- Objects { ... }
- Arrays [ ... ]
- Primitives:
- strings,
- numbers,
- boolean values true/false,
- null。
JSON是语言无关的纯数据规范,因此一些特定于 JavaScript 的对象属性会被 JSON.stringify 跳过 例如
- 函数方法。
- Synbol类型的属性
- 存储
undefined的属性
let user = {
sayHi() { // 被忽略
alert("Hello");
},
[Symbol("id")]: 123, // 被忽略
something: undefined // 被忽略
};
alert( JSON.stringify(user) ); // {}(空对象)
还可以支持嵌套对象转换,并且可以自动对其进行转换。
let meetup = {
title: "Conference",
room: {
number: 23,
participants: ["john", "ann"]
}
};
alert( JSON.stringify(meetup) );
/* 整个解构都被字符串化了
{
"title":"Conference",
"room":{"number":23,"participants":["john","ann"]},
}
*/
但是也不是万能的,例如出现了循环,或者引用,则会转换失败
let room = {
number: 23
};
let meetup = {
title: "Conference",
participants: ["john", "ann"]
};
meetup.place = room; // meetup 引用了 room
room.occupiedBy = meetup; // room 引用了 meetup
JSON.stringify(meetup); // Error: Converting circular structure to JSON
在这里,转换失败了,因为循环引用:room.occupiedBy 引用了 meetup,meetup.place 引用了 room。
JSON.parse
要解码 JSON 字符串,我们需要用到 JSON.parse。
let value = JSON.parse(str);
例子:字符串化数组
let numbers = "[0, 1, 2, 3]";
numbers = JSON.parse(numbers);
alert( 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] ); // 1
还有就是JSON 不支持注释。向 JSON 添加注释无效。