一语法
1,简单值
可以表示字符串,数值,布尔值和null,不支持javascript的undefined
JSON字符串只能用双引号表示,单引号会导致错误
2,对象
JSON中的对象要求给属性加引号
{ "name":"Nicholas", "age":29 }
没有变量和分号
3,数组
[25,"hi",true]
没有变量和分号
二,解析与序列化
1,JSON对象
stringify(),把javascript对象序列化为JSON字符串
parse(),把JSON字符串解析为原生Javascript值
var book = { title:"Professioal Javascript", authors:["Nicholas C. Zakas"], edition:3, year:2011 } var JSONText = JSON.stringify(book);
JSONText是使用stringify方法,将javaecript对象序列化转变为JSON字符串,字符串不包含任何字符或缩进,如下
{"title":"Professioal Javacsript","authors":["Nicholas C. Zakas"],"edition":3,"year":2011}
序列化对象时,所有函数及原型成员都会被有意忽略,值为undefined的任何属性也会被跳过
var bookcopy = JSON.parse(JSONText);
创建了与book类似的对象,但他们是两个独立的,没有任何关系的对象
2,序列化选项
JSON.stringify()方法接收另外两个参数,第一个参数是过滤器,可是一个数组,也可是函数,第二个参数是一个选项,表示是否在JSON字符串中保留缩进
1)过滤结果
如果过滤器是数组,那么结果中只包含数组中列出的属性
如果过滤器是函数,函数接收两个参数,属性名和属性值,属性名只能是字符串,键值可以更改,可为空字符串,也可变为undefined
var book = { "title":"Professional Javascript", "authors":["Nicholas C. Zakas"], "edition":3, "year":2011 } var JSONText = JSON.stringify(book,function(key,value){ switch(key){ case "authors": return value.join(","); case "year": return 5000; case "edition": return undefined; default: return value; } });
结果为{"title":"Professioanl Javascript","authors":["Nicholas C. Zakas"],"year":5000}
2)字符串缩进
第三个参数,是一个数值,表示每一个级别缩进的空格数
var JSONText = JSON.stringify(book,null,4);
最大缩进空格数为10,大于10的值会自动转换为10
如果第三个参数不是数值而是字符,则不用空格缩进,而用所给字符缩进
3)toJSON()方法
给对象定义toJSON(),方法返回其自身的JSON对象
var book = { "title":"Professional Javascript", "authors":["Nicholas C. Zakas"], "edition":3, "year":2011, toJSON:function(){return this.title;} };
toJSON()作为函数过滤器的补充,假设把一个对象传入JSON.stringify(),序列化该对象的顺序如下
1)如果存在toJSON(),方法而且能够通过它取得有效值,调用该方法,否则返回对象本身
2)如果提供了第二个参数,应用这个函数过滤器,传入函数过滤器的值是1)返回的值
3)对2)步返回的每个值进行相应的序列化
4)如果提供了第三个参数,执行相应的格式化
3,解析选项
JSON.parse()方法可以接受另一个参数,该参数是一个函数,将在每个键值对上调用
为了区别JSON.stringify()接受的替换(过滤)函数,这个函数叫做还原函数
var book = { "title":"Professional Javascript", "authors":["Nicholas C. Zakas"], "edition":3, "year":2011, releaseDate:new Date(2011,11,1) }; var jsonText = JSON.stringify(book); var bookcpoy = JSON.parse(jsonText,function(key,value){ if(key == "releaseDate"){ return new Date(value); }else{ return value; } });