JSON的应用

272 阅读2分钟

这是我参与8月更文挑战的第20天,活动详情查看:       8月更文挑战 ​

序言

我们经常会在项目中把一些数据转换为JSON,例如存储的时候,以便对象和函数正常保存,这种操作也叫作序列化,或JSON 编码。

JSON.stringify

JavaScript 提供了如下方法:

  1. JSON.stringify 将对象转换为 JSON。
  2. 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 编码的对象与对象字面量有几个重要的区别:

  1. 字符串使用双引号。JSON 中没有单引号或反引号。所以 'cf' 被转换为 "cf"。
  2. 对象属性名称也是双引号的。这是强制性的。所以 sheji:"cf"被转换成 "sheji":"cf"。

JSON 支持以下数据类型

  1. Objects { ... }
  2. Arrays [ ... ]
  3. Primitives:
  • strings,
  • numbers,
  • boolean values true/false,
  • null。

JSON是语言无关的纯数据规范,因此一些特定于 JavaScript 的对象属性会被 JSON.stringify 跳过 例如

  1. 函数方法。
  2. Synbol类型的属性
  3. 存储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 添加注释无效。