第20章 Json
- JSON(Javascript Object Notaion,对象表示法)并不从属于Javascript,只是一种数据格式
语法
- 简单值:使用与Javascript相同的语法,可以在JSON中表示字符串、数值、布尔值和null,但JSON不支持Javascript中的特殊值undefined
- 对象:表示一组无序的键值对儿
- 数组:表示一组有序的值的列表
简单值
- JSON字符串必须使用双引号(单引号会导致语法错误)
对象
- JSON中的对象要求给属性加引号
- JSON对象与Javascript的对象字面量的区别:
1.没有声明变量;
2.没有末尾的分号(因为这不是Javascirpt语句,所以不需要分号)
3.对象的属性必须加双引号,这在JSON中是必须的
1 | { |
数组
- JSON数组采用的就是JavaScript的数组字面量形式。
- 在JSON中,可以采用相同的语法表示同一个数组
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16[
{
"title": "Professional JS",
"author": ["Nicholas C. Zakas"
],
"edition": 2,
"year": 2017
},
{
"title": "Reading notes",
"author": ["xyy"
],
"edition": 1,
"year": 2016
}
]
解析与序列化
- stringify()和parse()用于把JavaScript对象序列化为JSON字符串和把JSON字符串解析为原生JavaScript值。
- 在序列化JS对象时,所有函数及原型成员都会被有意忽略,不体现在结果中
- 值为undefined的任何属性也都会被跳过
序列化选项
- JSON.stringify还可以接收另外两个参数:1、过滤器,可以是数组,也可以是函数。2、选项,表示是否在JSON字符串保留缩进
过滤结果
若过滤器是数组,则JSON.stringify结果将只包含数组列出的元素
1
2
3
4
5
6
7
8
9
10var book = {
title:"title",
author:[
"Nicholas C. Zakas"
],
edition:3,
year:2011
};
var jsonText = JSON.stringify(book,["title","edition"]);
//{"title":"title","edition":3}若过滤器是函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15var jsonText = JSON.stringify(book,function(key,value){
switch(key){
case "author":
return value.join(",");
case "year":
return 5000;
case "edition":
return undefined;
default:
return value;
}
});
//{"title":"title","author":"Nicholas C. Zakas","year":5000}
字符串缩进
- JSON.stringify第三个参数用于控制缩进和空白符,若是数值,表示每个级别的缩进空格数
- 最大缩进空格数为10,大于10的数值全部转为10
- 若缩进参数是字符串,则将被用于缩进字符
toJSON()方法
toJSON方法可以作为函数过滤器的补充,理解序列化顺序:
- 如果存在toJSON方法,而且能通过它取得有效值,调用该方法,否则返回对象本身
- 若提供了第二个参数,应用这个函数过滤器,传入函数过滤器的值是第一步返回值
- 对第二步返回值进行序列化
- 若提供了第三个参数,执行相应格式化
解析选项
- JSON.parse也接收另一个参数,是一个函数,将在每个键值对上调用。若返回结果为undefined,表示删除该值,返回其他值,则将该值插入到结果。
1 | var book = { |