认识JSON

  JSON(Javascript Object Notation javascript对象表示法),是web前端重要的一种数据格式,它是javascript一个严格的子集但又独立于javascript,很多语言都有解析和序列化JSON的API。说到JSON不得不提到XML,如今在互联网上传输的数据主要还是以XML为主,因其格式统一,容易扩展被广泛接受,但它的数据冗余和解析复杂是个硬伤。而JSON在传输小块数据时体现了它的优势,数据精简,解析简单(当做JS对象来访问)。有关JSON和XML之间的比较可参考:http://www.cnblogs.com/SanMaoSpace/p/3139186.html#top

一:语法

  既然是javascript语言的严格子集,只要记住它相对于javascript的特殊点就好了。

  1:不支持undefined

  2:字符串必须要用双引号

  3:JSON对象字面量中的属性必须要用双引号引起来<javascript中引不引都是OK的>

  4:没有变量的概念,末尾没有分号

//javascript
var person = {
    name: "alex",
    age: 36
};

//JSON
{
    "name":"alex",
    "age":36
}

//XML
<person>
  <name>alex</name>
  <age>36</age>
</person>

二:JSON的解析和序列化

  JSON的一大优势就是解析简单,可以直接将JSON数据解析为javascript对象,用对象的方式来访问JSON数据,相对于XML将数据解析为DOM文档,再使用DOM的方式来访问XML数据来说简化了很多。比如上面的例子要找age属性的值,JSON:obj.age   XML:document.getElementsByTagName("age")[0].nodeValue 差异立显。

  2.1 解析(JSON字符串解析为原生JavaScript)JSON.parse(jsonStr,[reviver])

  一般JSON数据是作为配置文件XX.json存在服务器端,所以前端一般是ajax请求服务器获取XX.json文件,因为原生ajax的返回数据类型只有responseXML和responseText两种,所有要获取json文件还得使用Jquery的$.getJSON or $.ajax方法,而Jquery ajax请求json文件的返回结果就是[object Object],可以直接使用JS的方法获取JSON的节点值了,综合上述,将JSON字符串解析为原生JavaScript对象的应用场景并不多。

  2.2 序列化(JavaScript对象序列化为JSON字符串)JSON.stringify(jsObj,[replacer],[space])

  序列化一般是要将得到的JSON字符串放到网络中进行传输了.

var person = {
    name:"alex",
    age:55,
    address:undefined,
    job:"software engineer",
    friends:{
        "friend1":"lee",
        "friend2":"lytton",
    }
};

Object.defineProperty(person,"job",{
    enumerable:false
});

var json_strig = JSON.stringify(person);
alert(json_strig);

 

 从序列化结果可以看出以下几点:

  1:值为undefined的属性被忽略

      2:属性如果是不可枚举的也被忽略

      3:JS的属性都添加了引号<JSON的格式规定>

   2.3 序列化选项

  JSON.stringify()还可接受另两个可选参数,依次是过滤器(一个数组 or 函数)和缩进设置

数组:数组成员表示要序列化的属性名字

var person = {
    name:"alex",
    age:55,
    address:undefined,
    job:"software engineer",
    friends:{
        "friend1":"lee",
        "friend2":"lytton",
    }
};

var json_strig = JSON.stringify(person,["name","age"]);
alert(json_strig);

 

函数:function(k,v),对每个要序列化的属性执行此函数返回此属性的value值

var person = {
    name:"alex",
    age:55,
    address:undefined,
    job:"software engineer",
    friends:{
        "friend1":"lee",
        "friend2":"lytton",
    }
};

var json_strig = JSON.stringify(person,function(key,value){
    switch(key){
        case "name":
            return "stone";
        default:
            return value;
    }
    
});
alert(json_strig);

 

使用缩进

var person = {
    name:"alex",
    age:55,
    address:undefined,
    job:"software engineer",
    friends:{
        "friend1":"lee",
        "friend2":"lytton",
    }
};

var json_strig = JSON.stringify(person,function(key,value){
    switch(key){
        case "name":
            return "stone";
        default:
            return value;
    }
    
},20);
alert(json_strig);

 

缩进只是为了让人更方便阅读json,对机器而言不重要,缩进最大值是10,大于10被当做10处理。

  2.4 toJSON()函数

  这个函数是对JSON.stringify的补充,如果JS对象中包含了这个函数的实现,JOSN.stringify()将优先按照这个方法对JS对象进行转换。

var person = {
    name:"alex",
    age:55,
    address:undefined,
    job:"software engineer",
    friends:{
        "friend1":"lee",
        "friend2":"lytton",
    },
    toJSON:function(){
        return this.name;
    }
};

var json_strig = JSON.stringify(person,function(key,value){
    switch(key){
        case "name":
            return "stone";
        default:
            return value;
    }
    
},20);

alert(json_strig);

 

因为JS对象有toJSON()方法了,所以对它的需序列化toJSON方法的优先级最高,最终序列化的结果就是this.name(alex)。下面是序列化的优先级顺序

 

  

   

posted @ 2017-01-19 20:44  会飞的小丑  阅读(277)  评论(0编辑  收藏  举报