JSON

1. 语法

json支持三种类型:

  • 简单值:字符串、数值、布尔值和 null 可以在 JSON 中出现,。特殊值 undefined 不可以。
  • 对象:第一种复杂数据类型,对象表示有序键/值对。每个值可以是简单值,也可以是复杂类型。
  • 数组:第二种复杂数据类型,数组表示可以通过数值索引访问的值的有序列表。数组的值可以是任意类型,包括简单值、对象,甚至其他数组。

1.1 简单值

JSON字符串必须用双引号,而js可以用单引号和双引号
简单值包括:字符串、数值、布尔值和 null

1.2 对象

和js对象字面量差不多,不同的地方是属性名必须用双引号括住。

  1. {
  2. "name": "Nicholas",
  3. "age": 29,
  4. "school": {
  5. "name": "Merrimack College",
  6. "location": "North Andover, MA"
  7. }
  8. }

1.3 数组

数组和对象可以组合使用,以表示更加复杂的数据结构

  1. [25, "hi", true]

2. 解析与序列化

2.1 JSON 对象

  • stringify()方法:JS转JSON
  1. let book = {
  2. title: "Professional JavaScript",
  3. authors: [
  4. "Nicholas C. Zakas",
  5. "Matt Frisbie"
  6. ],
  7. edition: 4,
  8. year: 2017
  9. };
  10. let jsonText = JSON.stringify(book);
  • parse()方法:JSON转JS
  1. let bookCopy = JSON.parse(jsonText);

2.2 序列化选项

JSON.stringify()方法
三个参数:

  • 要处理的对象
  • 过滤器,可以是数组或函数,用于过滤对象中的参数
  • 字符串缩进

利用第二个参数过滤:

  1. let book = {
  2. title: "Professional JavaScript",
  3. authors: [
  4. "Nicholas C. Zakas",
  5. "Matt Frisbie"
  6. ],
  7. edition: 4,
  8. year: 2017
  9. };
  10. let jsonText = JSON.stringify(book, ["title", "edition"]);

此时json中只包含:

  1. {"title":"Professional JavaScript","edition":4}

给第二个参数传函数:

  1. let jsonText = JSON.stringify(book, (key, value) => {
  2. switch(key) {
  3. case "authors":
  4. return value.join(",")
  5. case "year":
  6. return 5000;
  7. case "edition":
  8. return undefined;
  9. default:
  10. return value;
  11. }
  12. });

不想用的属性,返回 undefined 忽略该属性

  1. let jsonText = JSON.stringify(book, null, "--" );

这样,jsonText 的值会变成如下格式:

  1. {
  2. --"title": "Professional JavaScript",
  3. --"authors": [
  4. ----"Nicholas C. Zakas",
  5. ----"Matt Frisbie"
  6. --],
  7. --"edition": 4,
  8. --"year": 2017
  9. }

toJSON()方法

toJSON()方法可以与过滤函数一起使用
(1) 如果可以获取实际的值,则调用 toJSON()方法获取实际的值,否则使用默认的序列化。
(2) 如果提供了第二个参数,则应用过滤。传入过滤函数的值就是第(1)步返回的值。
(3) 第(2)步返回的每个值都会相应地进行序列化
(4) 如果提供了第三个参数,则相应地进行缩进。

2.3 解析选项

JSON.parse()方法也可以接收一个额外的参数
这个函数会针对每个键/值对都调用一次

  1. let book = {
  2. title: "Professional JavaScript",
  3. authors: [
  4. "Nicholas C. Zakas",
  5. "Matt Frisbie"
  6. ],
  7. edition: 4,
  8. year: 2017,
  9. releaseDate: new Date(2017, 11, 1)
  10. };
  11. let jsonText = JSON.stringify(book);
  12. let bookCopy = JSON.parse(jsonText,
  13. (key, value) => key == "releaseDate" ? new Date(value) : value);
  14. alert(bookCopy.releaseDate.getFullYear());