JSON语法

JSON和 XML类型,都是一种结构化的数据表示方式。所以, JSON并不是 JavaScript独有的数据格式,其他很多语言都可以对 JSON进行解析和序列化。
JSON的语法可以表示三种类型的值:
1.简单值:可以在 JSON中表示字符串、数值、布尔值和 null。但 JSON不支持 JavaScript中的特殊值 undefined
2.对象:顾名思义。
3.数组:顾名思义。


简单值
100"Lee" 这两个量就是 JSON的表示方法,一个是 JSON数值,一个是 JSON字符串。
布尔值和 null也是有效的形式。但实际运用中要结合对象或数组。
对象
JavaScript对象字面量表示法:

var box = {
name : 'Lee',
age : 100
};

JSON中的对象表示法需要加上双引号,并且不存在赋值运算和分号

{
"name" : "Lee", //使用双引号,否则转换会出错
"age" : 100
}

数组
JavaScript数组字面量表示法:

var box = [100,'Lee', true];

JSON中的数组表示法同样没有变量赋值和分号

[100,"Lee",true]

一般比较常用的一种复杂形式是数组结合对象的形式:

 1 [
 2 {
 3 "title":"a",
 4 "num":1
 5 },
 6 {
 7 "title":"b",
 8 "num":2
 9 },
10 {
11 "title":"c",
12 "num":3
13 }
14 ]

PS:一般情况下,我们可以把JSON结构数据保存到一个文本文件里,然后通过XMLHttpRequest对象去加载它,得到这串结构数据字符串(XMLHttpRequest对象将在Aajx章节中详细探讨)。所以,我们可以模拟这种过程。
模拟加载JSON文本文件的数据,并且赋值给变量。

var box='[{"name":"a","age":1},{"name":"b","age":2}]';

PS: 上面这短代码模拟了varbox=load('demo.json');赋值过程。 因为通过load加载的文本文件,不管内容是什么,都必须是字符串。所以两边要加上双引号。
其实JSON就是比普通数组多了两边的双引号,普通数组如下:

var box=[{name:'a',age:1},{name:'b',age:2}] 

 

二.解析和序列化
如果是载入的JSON文件, 我们需要对其进行使用, 那么就必须对JSON字符串解析成原生的JavaScript值。当然,如果是原生的JavaScript对象或数组,也可以转换成JSON字符串。
对于讲JSON字符串解析为JavaScript原生值,早期采用的是eval()函数。但这种方法既不安全,可能会执行一些恶意代码 。

var box='[{"name":"linjing","age":18},{"name":"linming","age":10}]';
alert(box);//JSON字符串
var json=eval(box);//使用eval()函数解析
alert(json);//得到JavaScript原生值

JSON对象提供了两个方法,一个是将原生JavaScript值转换为JSON字符串: stringify(); 另一个是将JSON字符串转换为JavaScript原生值: parse(); 

1 var box='[{"name":"linjing","age":18},{"name":"linming","age":10}]';
2 alert(box);//JSON字符串
3 var json=eval(box);//使用eval()函数解析
4 alert(json);//得到JavaScript原生值

JSON字符串转换为JavaScript原生值: parse()

1 var box=[{name:'a',age:1},{name:'b',age:2}]; //JavaScript原生值
2 var json=JSON.stringify(box); //转换成JSON字符串
3 alert(json);

在序列化JSON的过程中, stringify()方法还提供了第二个参数。第一个参数可以是一个数组, 也可以是一个函数, 用于过滤结果 第二个参数则表示是否在JSON字符串中保留缩进

 1 var arr=[
 2     {
 3         name:'linjing',
 4         age:10,
 5         grade:100
 6     },
 7     {
 8         name:'linjing',
 9         age:10,
10         grade:100
11     },
12     {
13         name:'linjing',
14         age:10,
15         grade:100
16     }
17 ]//js原生值
18 var json=JSON.stringify(arr,['age','grade'],4);//筛选age,grage,缩进4位
19 alert(json);

PS:如果不需要保留缩进,则不填即可;如果不需要过滤结果,但又要保留缩进,则讲过滤结果的参数设置为null。如果采用函数,可以进行复杂的过滤 。

 1 var arr=[
 2     {
 3         name:'linjing',
 4         age:10,
 5         grade:100
 6     },
 7     {
 8         name:'linjing',
 9         age:10,
10         grade:100
11     },
12     {
13         name:'linjing',
14         age:10,
15         grade:100
16     }
17 ]
18 
19 var json=JSON.stringify(arr,function(key,value){
20     switch(key){
21         case "name":
22             return "Mr."+value;
23         case "age":
24             return value+"years old";
25         default:
26             return value;
27     }
28     
29 },4);
30 alert(json);

PS:保留缩进除了是普通的数字,也可以是字符 。

还有一种方法可以自定义过滤一些数据,使用toJSON()方法,可以将某一组对象里指定返回某个值 。

 1 var arr=[
 2     {
 3         name:'linjing',
 4         age:10,
 5         grade:100,
 6         toSJON:function(){
 7             return this.name;
 8         }
 9     },
10     {
11         name:'linjing',
12         age:10,
13         grade:100,
14         toSJON:function(){
15             return this.name;
16         }
17     },
18     {
19         name:'linjing',
20         age:10,
21         grade:100,
22         toSJON:function(){
23             return this.name;
24         }
25     }
26 ]
27 var json=JSON.stringify(arr);
28 alert(json);

PS:由此可见序列化也有执行顺序,首先先执行 toJSON()方法;如果应用了第二个过滤参数,则执行这个方法;然后执行序列化过程,比如将键值对组成合法的 JSON字符串,比如加上双引号。如果提供了缩进,再执行缩进操作。

解析 JSON字符串方法 parse()也可以接受第二个参数, 这样可以在还原出 JavaScript值的时候替换成自己想要的值 .

var box='[{"name":"linjing","age":18,"color":"red"},{"name":"linming","age":10,"color":"green"}]';
var arr=JSON.parse(box,function(key,value){
    if(key=='name'){
        return "Ms."+value;
    }else{
        return value;
    }
});
alert(json[0].name);

 

 

 

 

 

 

 

 

 



posted @ 2017-05-16 23:14  代码小精灵  阅读(718)  评论(0编辑  收藏  举报