《JavaScript 高级程序设计》 第二十三章 JSON 学习记录

1、语法

  • JSON语法支持三种类型的值
    • 简单值:字符串、数值、布尔值和null可以出现,undefined不行
    • 对象:复杂数据类型,对象表示有序键值对,每个值可以是简单值也可以是复杂类型
    • 数组:复杂数据类型,数组可以通过数值索引访问值的有序列表,数组的值可以是其他任何类型,包括简单值、对象、其他数组。

1、简单值

  • 一个数字、一个字符串都是有效JSON
  • JSON字符串必须使用双引号
  • 布尔值和null也是有效的JSON值

2、对象

  • JSON中的对象必须使用双引号把属性名包围起来
{
  "name": "xxx",
  "age": 19
}
复制代码
  • 没有变量声明,没有分号,属性必须双引号

3、数组

[25, "hi", true]
复制代码

2、解析与序列化

1、JSON对象

  • JSON.stringify()
    • 将JavaScript序列化为JSON字符串
    • 省略函数和原型对象
    • 值为undefined的任何属性会被跳过
  • JSON.parse()
    • 将JSON解析为原生JavaScript值

2、序列化选项

  • JSON.stringify()还可以接收两个参数,用来指定其他序列化JavaScript对象
    • 过滤器,可以是数组或函数
    • 用于素锦结果JSON字符串的选项,更好地控制JSON序列化

1、过滤结果

  • 如果第二个参数是一个数组,则JSON.stringify()返回的结果只会包含数组中列出对象的属性。
let book = {
  title: "Professional JavaScript",
  authors: [
    "Nicholas C. Zakas",
    "Matt Frisbie"
  ],
  edition: 4,
  year: 2017
};
let jsonText = JSON.stringify(book, ["title", "edition"]);
// {"title":"Professional JavaScript","edition":4}
复制代码
  • 如果第二个参数是函数,则行为不同
    • 提供的函数接收两个参数:属性名key和属性值value。
    • 根据这个key决定要对相应属性执行什么操作。
    • key始终是字符串,只是在值不属于某个键值对时是空字符串
    • 返回undefined会导致该属性被忽略
let book = {
  title: "Professional JavaScript",
  authors: [
    "Nicholas C. Zakas",
    "Matt Frisbie"
  ],
  edition: 4,
  year: 2017
};
let jsonText = JSON.stringify(book, (key, value) => {
  switch (key) {
    case "authors":
      return value.join(",")
    case "year":
      return 5000;
    case "edition":
      return undefined;
    default:
      return value;
  }
});
// {"title":"Professional JavaScript","authors":"Nicholas C. Zakas,Matt Frisbie","year":5000} 
复制代码

2、字符串缩进

  • JSON.stringify()第三个参数控制缩进和空格
    • 参数是数值时,表示每一级缩进的空格数
      • 会自动换行。
      • 最大值为10,超过10会设为10
    • 参数是字符串,会用这个字符连接
      • 最大值为10,超过10会截断

3、toJSON()方法

  • 在要JSON.stringify()的对象上添加该方法,序列化会基于这个方法返回适当的JSON表示。
  • JSON.stringify()的步骤
    • 如果可以获取实际的值,则调用toJSON()方法获取实际值,否则使用默认序列化
    • 如果提供了第二个参数,则应用过滤,传入过滤函数的值就是之前返回的值
    • 上一步返回的值都会相应地进行序列化
    • 如果提供了第三个参数,则进行相应的缩进。

3、解析选项

  • JSON.parse()可以接收一个额外参数,这个函数会针对每个键值对都调用一次

    • 区别于传给JSON.stringify()的起过滤作用的替代函数,这个函数称为还原函数

    • 该函数也需要两个参数,属性名和属性值,也需要返回值

    • 如果还原函数返回undefined,则结果中就会删除对应的键。

    • 如果返回了其他任何值,则该值就会成为相应键的值插入到结果中。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享