欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

理解JSON

程序员文章站 2022-07-12 15:51:11
...

本章内容

  • 理解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数据交换格式。