20.JSON
20.1.语法
- JSON的语法可以表示三种类型的值
- 简单值
- 对象
- 数组
20.1.1.简单值
- 注意JSON字符串不支持单引号,不支持undefined,支持布尔值和null
20.1.2.对象
- JSON中的对象要求给属性加引号
20.1.3.数组
20.2.解析与序列化
20.2.1.JSON对象
JSON.stringify()
- 把一个JavaScript对象序列化为一个JSON字符串,默认情况下不包括任何空格字符或缩进
- 值为undefined的任何属性都会被跳过
JSON.parse()
20.2.2.序列化选项
-
JSON.stringify()
除了接受要序列化的JavaScript对象,还可以接受另外两个参数,第一个参数是过滤器。第二个参数是是否保持缩进的选项 -
Example
var book = { title: "JS design", authors: [ "ming", "mei" ], edition: 3, year: 2011 };
-
过滤器(第二个参数)
-
参数是数组
var jsonText = JSON.stringify(book, ["title", "edition"]); // 结果 {"title":"JS design","edition":3}
-
参数是函数
var jsonText = JSON.stringfy(book, function(key, value) { switch(key) { case "authors": return value.join(","); case "year": return 5000; case "edition": return undefined; // 返回undefined会在结果中删除该属性 default: return value; } }); {"title":"JS design","authors":"ming,mei","year":5000}
-
-
字符串缩进(第三个参数)
- 控制结果中的缩进和空白符
- 数字
- 表示每个级别缩进的空格数
- 超过10自动转换为10
- 字符
- 替换空格成为缩进字符,一般设置为制表符
- 长度超过10,自动转换为前10个字符
-
toJSON()
方法- 可以为任何对象添加
toJSON()
方法,序列化对象时会调用该方法 - 如果返回
undefined
,此时如果包含它的对象嵌入另一个对象中,会导致它的值变成null
,而如果它是顶级对象,则序列化该对象的结果就是undefined
- 可以为任何对象添加
-
-
序列化的内部顺序
- 如果存在
toJSON()
方法而且能通过它获取有效值,则调用该方法。否则返回对象本身 - 如果提供了第二个参数,应用这个过滤器
- 如果提供了第三个参数,执行相应的序列化
- 如果存在
20.2.3.解析选项
JSON.parse()
方法也可以接收另一个参数,该参数是一个函数,将在每个键值对上调用- 区别于
JSON.stringify()
接受的过滤函数,这个函数被称为还原函数( reviver ) - 如果还原函数返回
undefined
,则表示要从结果中删除相应的键