js高程读书笔记 第20章 JSON

[TOC]

本章内容

  • 理解JSON语法
  • 理解JSON
  • 序列化JSON

语法

  • 简单值: 使用与JavaScript相同的语法,可以在JSON中表示字符串、数值、布尔值和null。不支持undefined。
  • 对象: 对象作为一种复杂数据类型,表示的是一组无序的键值对儿。
  • 数组: 表示一组有序的值的列表。

简单值

对象

JSON中的对象与JavaScript字面量稍微有一些不同。

1
2
3
4
var person = {
name: "Nicholas",
age: 29
}

JSON中的对象要求给属性加引号。

1
2
3
4
var object = {
"name": "Nicholas",
"age": 29
}

JSON表示上述对象的方法如下:

1
2
3
4
{
"name": "Nicholas",
"age": 29
}

数组

JSON数组采用的就是JavaScript的数组字面量形式。

1
var values = [25, "hi", true];

在JSON中,可以采用相同的语法表示同一个数组

1
[25, "hi", true];

解析与序列化

shim:https://github.com/douglascrockford/JSON-js
解决不能原生支持JSON解析的浏览器。

stringify()和parse()用于把JavaScript对象序列化为JSON字符串和把JSON字符串解析为原生JavaScript值。

1
2
3
4
5
6
7
8
9
10
11
var book = {
title: "Professional JavaScript",
authors: [
"Nicholas C. Zakas"
],
edition: 3,
year: 2011
};

var jsonText = JSON.stringify(book, ["title", "edition"]);
alert(jsonText);

序列化选项

  1. 过滤结果
    JSON.stringify()第二个参数是一个数组,其中包含两个字符串:”title”,”edition”。这两个属性与将要序列化的对象属性是对应的,因此在返回的结果字符串中,就只会包含这两种属性。

如果第二个参数是函数。传入的函数接受两个参数,属性名和属性值。

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
var book = {
title: "Professional JavaScript",
authors: [
"Nicholas C. Zakas"
],
edition: 3,
year: 2011
};

var jsonText = JSON.stringify(book, function(key, value){
switch(key){
case "authors":
return value.join(",")

case "year":
return 5000;

case "edition":
return undefined;

default:
return value;
}
});
alert(jsonText);

  1. 字符串缩进

JSON.stringify()方法的第三个参数用于控制结果中的缩进和空白符。

1
2
3
4
5
6
7
8
9
10
11
var book = {
title: "Professional JavaScript",
authors: [
"Nicholas C. Zakas"
],
edition: 3,
year: 2011
};

var jsonText = JSON.stringify(book, null, 4);
console.log(jsonText);

1
2
3
4
5
6
7
8
{
"title": "Professional JavaScript",
"authors": [
"Nicholas C. Zakas"
],
"edition": 3,
"year": 2011
}
  1. toJSON()方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
var book = {
"title": "Professional JavaScript",
"authors": [
"Nicholas C. Zakas"
],
edition: 3,
year: 2011,
toJSON: function(){
return this.title;
}
};

var jsonText = JSON.stringify(book);
alert(jsonText);
  • 如果存在toJSON()方法而且能通过它取得有效的值,则调用该方法。否则,返回对象本身。
  • 如果提供了第二个参数,应用这个函数过滤器。传入函数过滤器的值是第一步返回的值。
  • 对第二步返回的每个值进行相应的序列化
  • 如果是提供了第三个参数,执行相应的格式化

解析选项

JSON.parse()方法可以坚守一个参数,该参数是一个函数,将在每个键值对上调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
var book = {
"title": "Professional JavaScript",
"authors": [
"Nicholas C. Zakas"
],
edition: 3,
year: 2011,
releaseDate: new Date(2011, 11, 1)
};

var jsonText = JSON.stringify(book);
alert(jsonText);

var bookCopy = JSON.parse(jsonText, function(key, value){
if (key == "releaseDate"){
return undefined;
} else {
return value;
}
});

alert("releaseDate" in bookCopy);