JSON

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":184     "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时将返回新日期,其余不变。

原文地址:https://www.cnblogs.com/jfl-xx/p/7259489.html