JSON结构可以由下面三种类型的数据组成。
- 值:表示字符串、数值、布尔值、对象、数组和null,但不支持JavaScript的undefined。
- 对象:表示一组无序键/值对。每个键/值对中的值可以是简单的值,也可以是复杂类型的值。
- 数组:表示一组有序的值列表,可以通过数字索引访问其中的值。数组的值也可以是任意类型。
JSON可以由无数个对象、数组嵌套组合而成,构成一个复杂的数据结构。
【提示】
JSON仅是一种表示结构化数据的格式,不支持变量、函数或类型实例,与JavaScript数据语法相同,但仅是JavaScript的一个子集。
值
最简单的JSON数据形式就是单个值。例如,下面这个值就是有效的JSON数据。
1
这是JSON表示数值1的方式。类似的,下面是JSON表示字符串的方式。
"Hello,World"
JavaScript字符串与JSON字符串最大区别:JSON字符串必须使用双引号,不能够使用单引号,因为单引号易导致语法错误。
布尔值和null也是有效的JSON形式。但是,在实际应用中,JSON更多地用来表示更复杂的数据结构,而简单的值只是整个数据结构中的一部分。
对于特殊字符可以使用转义序列来表示。
数值可以是整数、浮点数,也可以使用科学计数法来表示。数值可以直接引用,不需要添加引号。
逻辑值仅包括true或false,直接使用,不需要添加引号。
在JSON数据中,分隔符(如空格、制表符和换行符)是不被解析的,因此可以在数据结构内任意位置增加空白,以实现对数据的格式化排版。
对象
对象是无序的键/值对集合。基本构成规则:以左大括号({}开始,以右括号())结束,每个键与值对之间使用冒号(:)进行分隔,键/值对之间使用逗号(,)分隔。
【示例1】在下面这段JSON数据中,string为元素的名称,value为元素的值,中间使用冒号分隔。
{"string1":"value1"," string 2":" value 2"," string 3":" value 3",….. " string n":" value n"}
【提示】
JSON对象与JavaScript对象直接量稍微有一些不同。下面是一个JavaScript中的对象直接量。
var book = {
name : "w3c",
date : "2017"
};
这是在JavaScript中创建对象直接量的标准方式。但JSON中,对象要求给属性名加引号,如下所示。
{
"name" : "w3c",
"date" : "2017"
}
与JavaScript的对象直接量相比,JSON对象没有声明变量,因为在JSON中没有变量的概念。另外,没有末尾的分号,因为这不是JavaScript语句,所以不需要分号。
注意,JSON对象的属性必须加双引号,这在JSON中是必需的。属性的值可以是简单值,也可以是复杂类型值,因此可以像下面这样在对象中嵌人对象。
{
"name" : "w3c",
"book" : {
"name" : [{"lang" : "cn"},"XPath语言基础"]
}
}
上面例子在顶级对象中嵌入了"book"信息。虽然有两个"name"属性,但由于它们分别属于不同的对象,因此这样完全没有问题。不过,同一个对象中绝对不应该出现两个同名属性。
数组
数组是有序值的集合。基本构成规则:以左中括号([)开始,以右中括号(])结束。值之间使用逗号(,)分隔。
【示例2】下面是一段JSON数据,使用数组定义。
["value1"," value 2"," value 3",….. " value n"]
在这个有序列表中,前后值的顺序是不能够调换的,这与大部分语言中数组功能相一致,第一个值的索引序号为0,第二个值的索引序号为1。
JSON数组采用的是JavaScript中的数组直接量形式。例如,下面是JavaScript中的数组直接量。
var values = [1, true, "true"];
在JSON中,可以采用同样的语法表示同一个数组:
[1, true, "true"]
注意,JSON数组也没有变量和分号。把数组和对象结合起来,可以构成更复杂的数据集合。