本章内容
- 理解 JSON 语法
- 解析 JSON
- 序列化 JSON
关于 JSON,最重要的是要理解它是一种数据格式,不是一种编程语言。
20.1 语法
JSON 的语法可以表示以下三种类型的值。
- 简单值:使用与 JavaScript 相同的语法,可以在 JSON 中表示字符串、数值、布尔值和
null
。但不支持特殊值undefined
。 - 对象:对象作为一种复杂数据类型,表示的是一组有序的键值对儿。而每个键值对儿中的值可以是简单值,也可以是复杂数据类型的值。
- 数组:数组也是一种复杂数据类型,表示一组有序的值的列表,可以通过数值索引来访问其中的值。数组的值也可以是任意类型--简单值、对象或数组。
20.1.1 简单值
最简单的 JSON 数据形式就是简单值。
JavaScript 字符串与 JSON 字符串的最大区别在于,JSON 字符串必须使用双引号(单引号回导致语法错误)。
在实际应用中,更多地用来表示更复杂的数据结构,而简单值只是整个数据结构中的一部分。
201.2 对象
JSON 中的对象要求给属性加引号。
与 JavaScript 的对象字面量相比,JSON 对象有两个地方不一样。首先,没有声明变量。其次,没有末尾的分号(因为不是 JavaScript 语句,所以不需要分号)。
201.3 数组
JSON 数组也没有变量和分号。把数组和对象结合起来,可以构成更复杂的数据集合。
20.2 解析与序列化
20.2.1 JSON 对象
早期的鸡西器基本上就是使用 JavaScript 的eval()
函数。使用eval()
对 JSON 数据结构求值存在风险,因为可能会执行一些恶意代码。
JSON 对象有两个方法:stringify()
和parse()
。分别用于把JavaScript 对象序列化为 JSON 字符串和把 JSON 字符串解析为原生 JavaScript 值。
20.2.2 序列化选项
可以接受另外两个参数,这两个参数用于指定以不同的方式序列化 JavaScript 对象。第一个参数是个过滤器;第二个参数是一个选项,表示是否在 JSON 字符串中保留缩进。
var jsonText = JSON.stringify(book, ["title", "edition"]);
var jsonText = JSON.stringify(book, null, 4);
- 过滤结果
- 字符串缩进
- toJSON() 方法
可以为任何对象添加toJSON()
方法。
把一个对象传入JSON.stringify()
会优先调用toJSON()
方法。
20.2.3 解析选项
JSON.parse()
方法也可以接收另一个参数,该参数是一个函数,将在每个键值对儿上调用,这个函数被称为还原函数。
20.3 小结
JSON 是一个轻量级的数据格式,可以简化表示复杂数据结构的工作量。