第23章 JSON
JSON 是 XML 的替代方案,也是一种通用的数据格式。
# 语法
JSON 一共有 3 种类型的值。
- 简单值:字符串、数值、布尔值和 null,没有 undefined 值。
- 对象:属性名使用双引号包裹。
- 数组。
JSON 是一种数据格式,用来表示结构化的数据,没有变量、函数和对象实例的概念。
JSON 字符串必须要双引号包裹,不需要分号结尾。
{
"name": "Nico",
"age": 30,
"school": {
"name": "Harvard",
"academy": [
{
"name": "h1"
},
{
"name": "h2"
}
]
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 解析与序列化
JSON 对象有 2 个方法:
stringify(obj,filter,retract)。将 js 对象序列化为 json 字符串。
- obj,要序列化的 js 对象
- filter,过滤器,可以是数组或函数
- retract,控制缩进和空格
const book = { title: 'book name', authors: ['jack', 'rose'], edition: 4, } const bookText1 = JSON.stringify(book, ['title']) const bookText2 = JSON.stringify(book, (key, value) => { switch (key) { case 'title': return 'the name is ' + value default: return value } }) const bookText3 = JSON.stringify(book, null, 4) console.log(bookText1) // {"title":"book name"} console.log(bookText2) // {"title":"the name is book name","authors":["jack","rose"],"edition":4} console.log(bookText3) // { // "title": "book name", // "authors": [ // "jack", // "rose" // ], // "edition": 4 // }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27此外,如果对象拥有 toJSON 方法,则会调用该方法获取实际的值。
const book = { title: 'book name', authors: ['jack', 'rose'], edition: 4, toJSON: function() { return this.title }, } const bookText1 = JSON.stringify(book) // "book name"
1
2
3
4
5
6
7
8
9parse()。将 json 字符串解析为 js 对象。
JSON.parse()方法也有一个额外参数,可以拦截返回结果并修饰。
const book = { title: 'book name', authors: ['jack', 'rose'], edition: 4, } const bookText = JSON.stringify(book) const bookCopy = JSON.parse(bookText, (key, value) => (key === 'title' ? 'name is ' + value : value)) console.log(bookCopy) // { title: 'name is book name', authors: [ 'jack', 'rose' ], edition: 4 }
1
2
3
4
5
6
7
8
9另外,这里可以引申出一个简陋版的深度拷贝:
const book = { title: 'book name', authors: ['jack', 'rose'], edition: 4, } const bookCopy = JSON.parse(JSON.stringify(book)) console.log(bookCopy)
1
2
3
4
5
6
7
8
上次更新: 2022/04/26, 08:07:21