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)。下面是序列化的优先级顺序: