JSON是一种数据格式,不是一种编程语言。虽然它与有相同的语法格式,但是JSON并不从属于JavaScript。而且,并不是只有JavaScript才使用JSON。
JSON可以表示以下三种类型的值:
简单值:
使用于JavaScript相同的语法,可以在JSON中表示字符串、数值、布尔值和null。
1,"Hello World"都是有效的JSON数据。
注:JSON字符串必须使用双引号。
对象:
对象作为一种复杂数据类型,表示的是一组无序的键值对。每个键值对中的值可以是简单值,也可以是复杂数据类型的值。
以下为JavaScript中的一个对象字面量:
1 var person={ 2 name:"dragon", 3 age:18 4 };
JSON表示上述对象的方式如下:
1 { 2 "name":"dragon", 3 "age":18 4 }
注:与JavaScript的对象字面量相比,JSON对象有两个不同的地方。
首先,没有声明变量(JSON中没有变量的概念);其次,没有末尾的分号;最后,对象的属性必须加双引号。
属性的值可以是简单值,也可以是复杂类型值,例如以下对象:
1 { 2 "name":"dragon", 3 "age":18, 4 "school":{ 5 "name":"nj", 6 "location":"nanjing" 7 } 8 }
该对象有三个属性:"name","age"和"school"。其中,"shcool"属性的值又是一个对象,包含"name"和"location"两个属性。
数组:
数组也是一种复杂数据类型,表示一组有序的值的列表,可以通过数值所以来访问其中的值。数组的值可以是简单值、对象或数组。
JSON中的第二种复杂数据类型是数组。JSON数组采用的就是JavaScript中的数组字面量形式。
JavaScript中的数组字面量如下:
1 var vlaues=[25,"hi",true];
在JSON中,可以采用同样的语法表示同一个数组:
1 [25,"hi",true]
注:同样需要注意,JSON数组没有变量和分号。把数组和变量结合起来,组成更加复杂的数据集合。
1 [ 2 { 3 "title":"professional JS", 4 "authors":[ 5 "john" 6 ], 7 "edition":3, 8 "year":2011 9 }, 10 { 11 "title":"professional JS", 12 "authors":[ 13 "john" 14 ], 15 "edition":2, 16 "year":2010 17 }, 18 { 19 "title":"professional Ajax", 20 "authors":[ 21 "john","tom" 22 ], 23 "edition":2, 24 "year":2008 25 } 26 ]
解析和序列化
JSON对象有两个方法:stringify()和parse()。
JSON.stringify():
JSON.stringify()把JavaScript对象序列化为JSON字符串。
它除了接收要序列化的JavaScript对象外,还可以接收另外两个参数。
第一个参数为过滤器,可以是数组或者函数;第二个参数是一个选项,表示是否在JSON字符串中保留缩进。
现有JavaScript对象如下:
1 var book={ 2 "title":"professional JS", 3 "authors":[ 4 "john" 5 ], 6 "edition":3, 7 "year":2011 8 };
1.只包含JavaScript对象
1 var jsonText = JSON.stringify(book); 2 alert(jsonText); //{"title":"professional JS","authors":["john"],"edition":3,"year":2011}
2.序列化选项:
2.1过滤结果
1 var jsonText=JSON.stringify(book,["title","edition"]); 2 alert(jsonText); //{"title":"professional JS","edition":3}
注:JSON.stringify()的第二个参数为数组,包含"title"和"edition"。
这两个属性与将要序列化的对象的属性相对应,并且在返回的结果中只包含这两个属性。
2.2字符串缩进
第三个参数是数字,则表示每个级别缩进的空格数(最大空格数为10)。例如每个级别缩进四个空格,代码如下:
1 var jsonText=JSON.stringify(book,null,4); 2 alert(jsonText);
结果如下所示:
1 { 2 "title":"professional JS", 3 "authors":[ 4 "john" 5 ], 6 "edition":3, 7 "year":2011 8 }
第三个参数是字符串(最大长度不能超过10个字符长,否则只显示前十个字符),则该字符串被当作缩进字符,不再使用空格。
1 var jsonText=JSON.stringify(book,null,"--"); 2 { 3 --"title":"professional JS", 4 --"authors":[ 5 ----"john" 6 --], 7 --"edition":3, 8 --"year":2011 9 }
JSON.parse():
JSON.parse()把JSON字符串解析为原生的JavaScript值。
它除了接收JSON字符串外,还可以接收另一个函数参数,将在每个键值对上调用。该函数包含两个参数,即一个键和一个值,并且函数需要返回一个值。
现有JavaScript对象如下:
1 var book={ 2 "title":"professional JS", 3 "authors":[ 4 "john" 5 ], 6 "edition":3, 7 "year":2011, 8 "releaseDate":new Date(2011,11,1) 9 };
1.只包含JSON字符串
1 var jsonText = JSON.stringify(book); 2 var bookCopy=JSON.parse(jsonText); //此时得到与JavaScript相对应的值,不过book与bookCopy是两个独立的对象。
2.解析选项
1 var bookCopy=JSON.parse(jsonText,function(key,value){ 2 if(key=="releaseDate"){ 3 return new Date(value); 4 } 5 else{ 6 return value; 7 } 8 });
此时,该回调函数作用于每个键值对上,当key为releaseDate时将返回新日期,其余不变。