20.1 语法
JSON 的语法可以表示以下三种类型的值。
- 简单值:使用与JavaScript 相同的语法,可以在JSON 中表示字符串、数值、布尔值和null。但JSON 不支持JavaScript 中的特殊值undefined。
- 对象:对象作为一种复杂数据类型,表示的是一组无序的键值对儿。而每个键值对儿中的值可以是简单值,也可以是复杂数据类型的值。
- 数组:数组也是一种复杂数据类型,表示一组有序的值的列表,可以通过数值索引来访问其中的值。数组的值也可以是任意类型——简单值、对象或数组。
JSON 不支持变量、函数或对象实例,它就是一种表示结构化数据的格式,虽然与JavaScript 中表示数据的某些语法相同,但它并不局限于JavaScript 的范畴。
20.1.1 简单值
最简单的JSON 数据形式就是简单值。例如,下面这个值是有效的JSON 数据:
这是JSON 表示数值5 的方式。类似地,下面是JSON 表示字符串的方式:
"Hello world!"
JavaScript 字符串与JSON 字符串的最大区别在于,JSON 字符串必须使用双引号(单引号会导致语法错误)。
布尔值和null 也是有效的JSON 形式。但是,在实际应用中,JSON 更多地用来表示更复杂的数据结构,而简单值只是整个数据结构中的一部分。
20.1.2 对象
JSON 中的对象与JavaScript 字面量稍微有一些不同。下面是一个JavaScript 中的对象字面量:
var person = { name: "Nicholas", age: 29 };
这虽然是开发人员在JavaScript 中创建对象字面量的标准方式,但JSON 中的对象要求给属性加引号。实际上,在JavaScript 中,前面的对象字面量完全可以写成下面这样:
var object = { "name": "Nicholas", "age": 29 };
JSON 表示上述对象的方式如下:
{ "name": "Nicholas", "age": 29 }
与JavaScript 的对象字面量相比,JSON 对象有两个地方不一样。首先,没有声明变量(JSON 中没有变量的概念)。其次,没有末尾的分号(因为这不是JavaScript 语句,所以不需要分号)。再说一遍,对象的属性必须加双引号,这在JSON 中是必需的。属性的值可以是简单值,也可以是复杂类型值,因此可以像下面这样在对象中嵌入对象:
{ "name": "Nicholas", "age": 29, "school": {"name": "Merrimack College","location": "North Andover, MA" } }
这个例子在顶级对象中嵌入了学校("school")信息。虽然有两个"name"属性,但由于它们分别属于不同的对象,因此这样完全没有问题。不过,同一个对象中绝对不应该出现两个同名属性。
与JavaScript 不同,JSON 中对象的属性名任何时候都必须加双引号。手工编写JSON 时,忘了给对象属性名加双引号或者把双引号写成单引号都是常见的错误。
20.1.3 数组
JSON 中的第二种复杂数据类型是数组。JSON 数组采用的就是JavaScript 中的数组字面量形式。例如,下面是JavaScript 中的数组字面量:
var values = [25, "hi", true];
在JSON 中,可以采用同样的语法表示同一个数组:
[25, "hi", true]
同样要注意,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 }]
这个数组中包含一些表示图书的对象。每个对象都有几个属性,其中一个属性是"authors",这个属性的值又是一个数组。对象和数组通常是JSON 数据结构的最外层形式(当然,这不是强制规定的),利用它们能够创造出各种各样的数据结构。