本章内容

  • 理解JSON语法
  • 解析JSON
  • 序列化JSON

语法

JSON的语法可以表示以下三种类型的值

  • 简单值:使用与Javascript相同的语法,可以在JSON中表示字符串、数值、布尔值和null。但JSON不支持Javascript中的特殊值undefined
  • 对象:对象作为一种复杂数据类型,表示的是一组有序的键值对。而每个键值对的值可以是简单值,也可以是复杂数据类型的值。
  • 数组:数组也是一种复杂数据类型,表示一组有序的值的列表,可以通过数值索引来访问其中的值。数组的值也可以是任意类型-简单值、对象或数组。

简单值

Javascript字符串与JSON字符串的最大区别在于,JSON字符串必须使用双引号(单引号会导致语法错误)。

布尔值和null也是有效的JSON形式。但是,在实际应用中,JSON更多地用来表示更复杂的数据结构,而简单值只是整个数据结构中的一部分。

对象

JSON中的对象与Javascript字面量有一些不同。下面是一个Javascript中的对象字面量:

var object = {
    "name": "ZC",
    "age": 29
}

"{
    "name": "ZC",
    "age": 29
}"
复制代码

与Javascript的对象字面量相比,JSON对象有两个地方不一样。首先,没有声明变量。其次,没有末尾的分号。

与JavaScript不同,JSON中对象的属性名任何时候都必须加双引号。

数组

JSON中的第二种复杂数据类型是数组。JSON数组采用的就是Javascript中的数组字面量形式。

var arr1 = [null, undefined, 1, 'a'];
undefined
JSON.stringify(arr1)
"[null,null,1,"a"]"
复制代码

注意:JSON不支持undefined,所以数组中的undefined会被转换成null

解析与序列化

JSON流行的原因是可以把JSON数据结构解析为有用的Javascript对象。 XML数据结构要解析成DOM文档而且从中提取数据极为麻烦。
JSON可以直接解析为javascript对象。

JSON对象

JSON对象有两个方法:stringify()和parse()。在最简单的情况下,这两个方法分别用于把Javascript对象序列化为JSON字符串和把JSON字符串解析为原生javascript值。

在序列化javascript对象时,所有函数及原型成员都会被有意忽略,不体现在结果中。此外,值为undefined的任何属性也都会被跳过。结果中最终都是值为有效JSON数据类型的实例属性。

将JSON字符串直接传递给JSON.parse()就可以得到相应的javascript值。

序列化选项

JSON.stringify()除了要序列化的javascript对象外,还可以接受另外两个参数,这两个参数用于指定以不同的方式序列化javascript对象。第一个参数是个过滤器,可以是一个数组,也可以是一个函数;第二个参数是一个选项,表示是否在JSON字符串中保留缩进。单独或组合使用这两个参数,可以更全面深入地控制JSON的序列化。

过滤结果

字符串缩进

JSON.stringify()方法的第三个参数用于控制结果中的缩进和空白符。

toJSON()方法

如果JSON.stringify()还是不能满足对某些对象进行自定义序列化的需求。这些情况下,可以通过对象上调用toJSON()方法,返回其自身的JSON数据格式。

toJSON()可以作为函数过滤器的补充,因此理解序列化的内部顺序十分重要。假设把一个对象传入JSON.stringify(),序列化该对象的顺序如下。

  • 如果存在toJSON()方法而且能通过它取得有效的值,则调用该方法。否则,按默认顺序执行序列化。
  • 如果提供额第二个参数,应用这个函数过滤器传入函数过滤器的值是上一步返回的值。
  • 对上一步返回的每个值进行相应的序列化。
  • 如果提供了第三个参数,执行相应的格式化。
    理解这个顺序非常重要。

解析选项

小结

JSON是个非常使用web数据交换格式。