《Javascript 高级程序设计(第三版)》笔记0x21 JavaScript Object Notation

114 阅读4分钟

目录

语法

    简单值

    对象

    数组

 解析与序列化

    JSON对象

    序列化选项

        过滤结果

        字符串缩进

        toJSON()方法

    解析选项


语法

JSON 的语法可以表示以下三种类型的值。
简单值:使用与 JavaScript 相同的语法,可以在 JSON 中表示字符串、数值、布尔值和 null。但 JSON 不支持 JavaScript 中的特殊值 undefined。
对象:对象作为一种复杂数据类型,表示的是一组无序的键值对儿。而每个键值对儿中的值可以是简单值,也可以是复杂数据类型的值。
数组:数组也是一种复杂数据类型,表示一组有序的值的列表,可以通过数值索引来访问其中的值。数组的值也可以是任意类型——简单值、对象或数组。

    简单值

    最简单的 JSON 数据形式就是简单值。如数值 5,字符串 "Hello world!"。JavaScript 字符串与 JSON 字符串的最大区别在于, JSON 字符串必须使用双引号(单引号会导致语法错误)。布尔值和 null 也是有效的 JSON 形式。但是,在实际应用中, JSON 更多地用来表示更复杂的数据结构,而简单值只是整个数据结构中的一部分。 

    对象

    与 JavaScript 的对象字面量相比, JSON 对象有两个地方不一样。首先,没有声明变量(JSON 中没有变量的概念)。其次,没有末尾的分号(因为这不是 JavaScript 语句,所以不需要分号)。对象的属性必须加双引号,这在 JSON 中是必需的。属性的值可以是简单值,也可以是复杂类型值 。

{
	"name": "Nicholas",
	"age": 29,
	"school": {
		"name": "Merrimack College",
		"location": "North Andover, MA"
	}
}

    数组

    JSON 数组也没有变量和分号。把数组和对象结合起来,可以构成更复杂的数据集合

[
	{
		"title": "Professional JavaScript",
		"authors": [
			"Nicholas C. Zakas"
		],
		edition: 3,
		year: 2011
	},
	{
		"title": "Professional JavaScript",
		"authors": [
			"Nicholas C. Zakas"
		],
		edition: 2,
		year: 2009
	},
	{
		"title": "Professional Ajax",
		"authors": [
			"Nicholas C. Zakas",
			"Jeremy McPeak",
			"Joe Fawcett"
		],
		edition: 2,
		year: 2008
	},
	{
		"title": "Professional Ajax",
		"authors": [
			"Nicholas C. Zakas",
			"Jeremy McPeak",
			"Joe Fawcett"
		],
		edition: 1,
		year: 2007
	},
	{
		"title": "Professional JavaScript",
		"authors": [
			"Nicholas C. Zakas"
		],
		edition: 1,
		year: 2006
	}
]

 解析与序列化

    JSON对象

    JSON 对象有两个方法: stringify()和 parse()。在最简单的情况下,这两个方法分别用于把JavaScript 对象序列化为 JSON 字符串和把 JSON 字符串解析为原生 JavaScript 值。

var book = {
        title: "Professional JavaScript",
        authors: [
            "Nicholas C. Zakas"
        ],
        edition: 3,
        year: 2011
       };
var jsonText = JSON.stringify(book);

    序列化选项

        过滤结果

var book = {
		"title": "Professional JavaScript",
		"authors": [
			"Nicholas C. Zakas"
		],
		edition: 3,
		year: 2011
	};
var jsonText = JSON.stringify(book, ["title", "edition"]);

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;
		}
	});

        字符串缩进

    JSON.stringify()方法的第三个参数用于控制结果中的缩进和空白符。如果这个参数是一个数值,那它表示的是每个级别缩进的空格数。

var book = {
		"title": "Professional JavaScript",
		"authors": [
			"Nicholas C. Zakas"
		],
		edition: 3,
		year: 2011
	};
var jsonText = JSON.stringify(book, null, 4);

        toJSON()方法

//可以为任何对象添加 toJSON()方法
var book = {
		"title": "Professional JavaScript",
		"authors": [
			"Nicholas C. Zakas"
		],
		edition: 3,
		year: 2011,
		toJSON: function(){
			return this.title;
		}
	};
var jsonText = JSON.stringify(book);

    解析选项

   JSON.parse()方法也可以接收另一个参数,该参数是一个函数,将在每个键值对儿上调用。为了区别 JSON.stringify()接收的替换(过滤)函数(replacer),这个函数被称为还原函数(reviver),但实际上这两个函数的签名是相同的——它们都接收两个参数,一个键和一个值,而且都需要返回一个值。

var book = {
		"title": "Professional JavaScript",
		"authors": [
			"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());