1、语法
- JSON语法支持三种类型的值
- 简单值:字符串、数值、布尔值和null可以出现,undefined不行
- 对象:复杂数据类型,对象表示有序键值对,每个值可以是简单值也可以是复杂类型
- 数组:复杂数据类型,数组可以通过数值索引访问值的有序列表,数组的值可以是其他任何类型,包括简单值、对象、其他数组。
1、简单值
- 一个数字、一个字符串都是有效JSON
- JSON字符串必须使用双引号
- 布尔值和null也是有效的JSON值
2、对象
- JSON中的对象必须使用双引号把属性名包围起来
{
"name": "xxx",
"age": 19
}
复制代码
- 没有变量声明,没有分号,属性必须双引号
3、数组
[25, "hi", true]
复制代码
2、解析与序列化
1、JSON对象
JSON.stringify()
- 将JavaScript序列化为JSON字符串
- 省略函数和原型对象
- 值为undefined的任何属性会被跳过
JSON.parse()
- 将JSON解析为原生JavaScript值
2、序列化选项
JSON.stringify()
还可以接收两个参数,用来指定其他序列化JavaScript对象- 过滤器,可以是数组或函数
- 用于素锦结果JSON字符串的选项,更好地控制JSON序列化
1、过滤结果
- 如果第二个参数是一个数组,则
JSON.stringify()
返回的结果只会包含数组中列出对象的属性。
let book = {
title: "Professional JavaScript",
authors: [
"Nicholas C. Zakas",
"Matt Frisbie"
],
edition: 4,
year: 2017
};
let jsonText = JSON.stringify(book, ["title", "edition"]);
// {"title":"Professional JavaScript","edition":4}
复制代码
- 如果第二个参数是函数,则行为不同
- 提供的函数接收两个参数:属性名key和属性值value。
- 根据这个key决定要对相应属性执行什么操作。
- key始终是字符串,只是在值不属于某个键值对时是空字符串
- 返回undefined会导致该属性被忽略
let book = {
title: "Professional JavaScript",
authors: [
"Nicholas C. Zakas",
"Matt Frisbie"
],
edition: 4,
year: 2017
};
let jsonText = JSON.stringify(book, (key, value) => {
switch (key) {
case "authors":
return value.join(",")
case "year":
return 5000;
case "edition":
return undefined;
default:
return value;
}
});
// {"title":"Professional JavaScript","authors":"Nicholas C. Zakas,Matt Frisbie","year":5000}
复制代码
2、字符串缩进
JSON.stringify()
第三个参数控制缩进和空格- 参数是数值时,表示每一级缩进的空格数
- 会自动换行。
- 最大值为10,超过10会设为10
- 参数是字符串,会用这个字符连接
- 最大值为10,超过10会截断
- 参数是数值时,表示每一级缩进的空格数
3、toJSON()方法
- 在要
JSON.stringify()
的对象上添加该方法,序列化会基于这个方法返回适当的JSON表示。 JSON.stringify()
的步骤- 如果可以获取实际的值,则调用
toJSON()
方法获取实际值,否则使用默认序列化 - 如果提供了第二个参数,则应用过滤,传入过滤函数的值就是之前返回的值
- 上一步返回的值都会相应地进行序列化
- 如果提供了第三个参数,则进行相应的缩进。
- 如果可以获取实际的值,则调用
3、解析选项
-
JSON.parse()
可以接收一个额外参数,这个函数会针对每个键值对都调用一次-
区别于传给
JSON.stringify()
的起过滤作用的替代函数,这个函数称为还原函数 -
该函数也需要两个参数,属性名和属性值,也需要返回值
-
如果还原函数返回undefined,则结果中就会删除对应的键。
-
如果返回了其他任何值,则该值就会成为相应键的值插入到结果中。
-
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END