JavaScript高级程序设计读书笔记20

第20章 Json

  • JSON(Javascript Object Notaion,对象表示法)并不从属于Javascript,只是一种数据格式

语法

  • 简单值:使用与Javascript相同的语法,可以在JSON中表示字符串、数值、布尔值和null,但JSON不支持Javascript中的特殊值undefined
  • 对象:表示一组无序的键值对儿
  • 数组:表示一组有序的值的列表

简单值

  • JSON字符串必须使用双引号(单引号会导致语法错误)

对象

  • JSON中的对象要求给属性加引号
  • JSON对象与Javascript的对象字面量的区别:

    1.没有声明变量;
    2.没有末尾的分号(因为这不是Javascirpt语句,所以不需要分号)
    3.对象的属性必须加双引号,这在JSON中是必须的

1
2
3
4
5
6
7
8
{
"name":"Nicholas",
"age":19,
"school":{
"name":"school",
"location":"location"
}
}

数组

  • JSON数组采用的就是JavaScript的数组字面量形式。
  • 在JSON中,可以采用相同的语法表示同一个数组
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    [
    {
    "title": "Professional JS",
    "author": ["Nicholas C. Zakas"
    ],
    "edition": 2,
    "year": 2017
    },
    {
    "title": "Reading notes",
    "author": ["xyy"
    ],
    "edition": 1,
    "year": 2016
    }
    ]

解析与序列化

  • stringify()和parse()用于把JavaScript对象序列化为JSON字符串和把JSON字符串解析为原生JavaScript值。
  • 在序列化JS对象时,所有函数及原型成员都会被有意忽略,不体现在结果中
  • 值为undefined的任何属性也都会被跳过

序列化选项

  • JSON.stringify还可以接收另外两个参数:1、过滤器,可以是数组,也可以是函数。2、选项,表示是否在JSON字符串保留缩进

过滤结果

  • 若过滤器是数组,则JSON.stringify结果将只包含数组列出的元素

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    var book = {
    title:"title",
    author:[
    "Nicholas C. Zakas"
    ],
    edition:3,
    year:2011
    };
    var jsonText = JSON.stringify(book,["title","edition"]);
    //{"title":"title","edition":3}
  • 若过滤器是函数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    var jsonText = JSON.stringify(book,function(key,value){
    switch(key){
    case "author":
    return value.join(",");

    case "year":
    return 5000;

    case "edition":
    return undefined;
    default:
    return value;
    }
    });
    //{"title":"title","author":"Nicholas C. Zakas","year":5000}

字符串缩进

  • JSON.stringify第三个参数用于控制缩进和空白符,若是数值,表示每个级别的缩进空格数
  • 最大缩进空格数为10,大于10的数值全部转为10
  • 若缩进参数是字符串,则将被用于缩进字符

toJSON()方法

toJSON方法可以作为函数过滤器的补充,理解序列化顺序:

  1. 如果存在toJSON方法,而且能通过它取得有效值,调用该方法,否则返回对象本身
  2. 若提供了第二个参数,应用这个函数过滤器,传入函数过滤器的值是第一步返回值
  3. 对第二步返回值进行序列化
  4. 若提供了第三个参数,执行相应格式化

解析选项

  • JSON.parse也接收另一个参数,是一个函数,将在每个键值对上调用。若返回结果为undefined,表示删除该值,返回其他值,则将该值插入到结果。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var book = {
title:"title",
author:[
"Nicholas C. Zakas"
],
edition:3,
year:2011,
releaseDate:new Date(2011,11,1)
};

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

alert(bookCopy.releaseDate.getFullYear()); //2011