JSON
1. 语法
json支持三种类型:
- 简单值:字符串、数值、布尔值和 null 可以在 JSON 中出现,。特殊值 undefined 不可以。
- 对象:第一种复杂数据类型,对象表示有序键/值对。每个值可以是简单值,也可以是复杂类型。
- 数组:第二种复杂数据类型,数组表示可以通过数值索引访问的值的有序列表。数组的值可以是任意类型,包括简单值、对象,甚至其他数组。
1.1 简单值
JSON字符串必须用双引号,而js可以用单引号和双引号
简单值包括:字符串、数值、布尔值和 null
1.2 对象
和js对象字面量差不多,不同的地方是属性名必须用双引号括住。
{
"name": "Nicholas",
"age": 29,
"school": {
"name": "Merrimack College",
"location": "North Andover, MA"
}
}
1.3 数组
数组和对象可以组合使用,以表示更加复杂的数据结构
[25, "hi", true]
2. 解析与序列化
2.1 JSON 对象
- stringify()方法:JS转JSON
let book = {
title: "Professional JavaScript",
authors: [
"Nicholas C. Zakas",
"Matt Frisbie"
],
edition: 4,
year: 2017
};
let jsonText = JSON.stringify(book);
- parse()方法:JSON转JS
let bookCopy = JSON.parse(jsonText);
2.2 序列化选项
JSON.stringify()方法
三个参数:
- 要处理的对象
- 过滤器,可以是数组或函数,用于过滤对象中的参数
- 字符串缩进
利用第二个参数过滤:
let book = {
title: "Professional JavaScript",
authors: [
"Nicholas C. Zakas",
"Matt Frisbie"
],
edition: 4,
year: 2017
};
let jsonText = JSON.stringify(book, ["title", "edition"]);
此时json中只包含:
{"title":"Professional JavaScript","edition":4}
给第二个参数传函数:
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;
}
});
不想用的属性,返回 undefined 忽略该属性
let jsonText = JSON.stringify(book, null, "--" );
这样,jsonText 的值会变成如下格式:
{
--"title": "Professional JavaScript",
--"authors": [
----"Nicholas C. Zakas",
----"Matt Frisbie"
--],
--"edition": 4,
--"year": 2017
}
toJSON()方法
toJSON()方法可以与过滤函数一起使用
(1) 如果可以获取实际的值,则调用 toJSON()方法获取实际的值,否则使用默认的序列化。
(2) 如果提供了第二个参数,则应用过滤。传入过滤函数的值就是第(1)步返回的值。
(3) 第(2)步返回的每个值都会相应地进行序列化
(4) 如果提供了第三个参数,则相应地进行缩进。
2.3 解析选项
JSON.parse()方法也可以接收一个额外的参数
这个函数会针对每个键/值对都调用一次
let book = {
title: "Professional JavaScript",
authors: [
"Nicholas C. Zakas",
"Matt Frisbie"
],
edition: 4,
year: 2017,
releaseDate: new Date(2017, 11, 1)
};
let jsonText = JSON.stringify(book);
let bookCopy = JSON.parse(jsonText,
(key, value) => key == "releaseDate" ? new Date(value) : value);
alert(bookCopy.releaseDate.getFullYear());