JSON数据格式
JSON
JSON 是一种数据格式,不是一种编程语言。一般用于Web服务的前后端的数据交流格式。
一、类型
JSON 的语法可以有3种类型的值:
- 简单值:包括字符串、数值、布尔值和 null(但是不支持 Javascript 中的 undefined)
- 对象:表示一组无序的键值对
- 数组:表示一组有序的值的列表
二、与 Jsvacript 的区别
- Javascript 是一种编程语言,JSON只是一种数据格式
- JSON 没有变量声明,也没有末尾的分号
;
- JSON 字符串必须使用双引号(单引号会导致语法错误)
Javascript 的语法:
1 | var object = { |
JSON 的语法:
1 | { |
三、解析与序列化
JSON 数据是 Web 服务中数据交换的格式,因此它可以与 Javascript 对象相互转换。
早期的浏览器,一般使用 eval()
函数来解析、解释 JSON 字符串并返回 Javascript 对象或数组。
ECMAScript 5 对解析 JSON 的行为进行来规范,定义了全局对象 JSON。
JSON 对象有两个方法:stringify()
和 parse()
。其中 stringify()
用于将 Javascript 对象或数组序列化成 JSON 字符串,parse()
方法用于将 JSON 字符串解析成 avascript 对象或数组。
3.1 序列化
JSON 序列化负责将 Javascript 对象或数组序列化成 JSON 字符串,实现这个功能的方法是 JSON.stringify()
。
stringify
方法的参数有3个:
- 需要序列化的 Javascript 对象
- 过滤器,可以是数组,也可以是函数
- JSON 字符串的缩进值,可以是数值,也可以是字符串
例如:
1 | var jsonObj = { |
则 jsonText
的值为:
1 | {"name":"Zhangsan","age":20} |
3.1.1 过滤器
使用 stringify
的第2个参数,可以自定义过滤序列化的结果。
过滤器参数可以有2种格式:数组和函数。
1)如果过滤器参数是数组,那么 stringify
序列化的结果只会返回包含在数组中的属性:
1 | var jsonObj = { |
则 jsonText
的值为:
1 | {"name":"Zhangsan"} |
2)如果过滤器参数是函数,该函数会接收2个参数:属性(键)名和属性值。
函数返回值就是对应属性(键)名的值,如果函数返回值是 undefined
,那么相应的属性会被忽略:
1 | var jsonObj = { |
则 jsonText
的值为:
1 | {"name":"Zhangsan"} |
3.1.2 缩进
默认情况下,JSON.stringify()
输出的 JSON 字符串是不包含任何空格字符或缩进的:
1 | var jsonObj = { |
则 jsonText
的值为:
1 | {"name":"Zhangsan","age":20} |
使用 stringify
方法的第3个参数,可以控制序列化结果中的缩进和空白符。
缩进参数可以有2种格式:数值和字符串。
1)如果缩进参数是数值,表示的是每个缩进级别的空格数:
1 | var jsonObj = { |
则 jsonText
的值为(缩进空格数为4):
1 | { |
只要传入了有效的缩进参数值,结果字符串也会包含换行符(因为只缩进不换行意义不大)。
最大缩进格数为10,所有大于10的值都会自动转换为10。
2)如果缩进参数是字符串,则这个字符串将会被用作缩进字符(不再使用空格):
1 | var jsonObj = { |
则 jsonText
的值为(缩进字符不再是空格):
1 | { |
缩进字符最大长度也不能超过10,如果字符长度超过了10,就会被截取成10个字符。
3.1.3 toJSON
有时候,JSON.stringify()
还不能满足自定义序列化的需求,因此可以给对象定义 toJSON
方法,返回自定义的 JSON 数据格式。
1 | var jsonObj = { |
则 jsonText
的值为(缩进字符不再是空格):
1 | {"sex": "female"} |
3.1.4 序列化顺序
- 如果存在
toJSON
方法,返回该方法的返回值,否则,返回对象本身 - 如果提供了第2个参数,对第1步返回的值进行过滤
- 对第2步返回的每个值进行序列化
- 如果提供了第3个参数,执行相应的格式化
3.2 解析
JSON 解析负责将 JSON 字符串解析成 Javascript 对象,实现这个功能的方法是 JSON.parse()
。
parse
方法的参数有2个:
- 需要解析的 JSON 字符串
- 还原函数,和过滤器函数类似
例如:
1 | var jsonText = '{"name":"Zhangsan","age":20}'; |
则 jsonObj
的值为:
1 | { |
3.2.1 还原函数
还原函数和过滤器函数类似,也是接收2个参数:属性(键)名和属性值。
还原函数的返回值将作为属性(键)名的值,如果函数返回 undefined
,表示从结果中删除相应的键。
1 | var jsonText = '{"name":"Zhangsan","age":20}'; |
则 jsonObj
的值为:
1 | { |