JSON(Javascript Object Notaion,对象表示法)并不从属于Javascript,只是一种数据格式,很多编程语言都有针对JSON的解析器和序列化器
1.语法
JSON语法可以表示以下三种类型的值:
①简单值:使用与Javascript相同的语法,可以在JSON中表示字符串、数值、布尔值和null,但JSON不支持Javascript中的特殊值undeined
②对象:表示一组无序的键值对儿
③数值:表示一组有序的列表
JSON不支持变量、函数或对象实例
2.注意点
Javascript字符串与JSON字符串的最大区别在于,JSON字符串必须使用双引号(单引号会导致语法错误)
其实Javascript中的对象字面量完全可以写成下面这样:
var object1 = {
"name": "Nicholas",
"age": 29
}
不过与Javascript的对象字面量相比,JSON对象有两个地方不一样。
首先,没有声明变量;
其次,没有末尾的分号(因为这不是Javascirpt语句,所以不需要分号),其实JS也不可以不写的;
最后,对象的属性必须加双引号,这在JSON中是必须的
2.解析与序列化
背景:早期的JSON解析器基本上就是使用JavaScript的eval()函数。由于JSON是JavaScript语法的子集,因此eval() 函数可以解析、解释并返回JavaScript对象和数组。ECMAScript5对解析JSON进行了规范,定义了全局对象JSON。支持这个对象的浏览器有IE8+和其他主流浏览器等;对于早期浏览器,可以戳此链接使用一个shim: JSON
JSON对象有两个方法:stringify()和parse()。在最简单的情况下,这两个方法分别用于把JavaScript对象序列化为JSON字符串和把JSON字符串解析为原生JavaScript值。
有个疑问:用原生JS的XHR实现AJAX时,即使Java后台返回的时一个JSON,还是要用JSON.parse(result)解析令我很困惑
①序列化选项JSON.stringify()
默认情况下,JSON.stringify()输出的JSON字符串不包含任何空格字符串或缩进。另外,在序列化JavaScript对象时,所有函数以及原型成员都会被有意忽略,不体现在结果中。此外,值为undefined的任何属性也都会被跳过。因为,JSON不支持变量、函数或对象实例,和JavaScript的特殊值undefined,而这函数的结果就是返回JSON字符串。
实际上,JSON.stringify(),除了除了要序列化的JavaScript对象外,还可以接受两个参数。一个参数是过滤器,可以是一个数组,也可以是一个函数( 处理每个JSON属性);第二个参数是一个选项,表示在JSON字符串中是否保留缩进(填入4就都缩进4格,填入"--"每行都加上"--")
②toJSON()方法,如果在JSON对象上定义toJSON()方法的话,JSON.stringify()方法的是toJSON()方法返回的值
序列化对象的顺序:
(1)如果存在toJSON()方法而且能通过它取得有效的值,则调用该方法。否则返回对象本身
(2)如果提供了第二个参数,应用这个函数过滤器。传入函数过滤器的值是第(1)步返回的值
(3)对第(2)步返回的每个值进行相应的序列化
(4)如果提供了第三个参数,执行相应的格式化
理解这个顺序很重要
3.解析选项
JSON.parse()方法除了接受要解析的字符串外,还接受另一个参数,该参数是一个函数,将在每个键值对儿调用。如果函数返回undefined,则表示要从结果中删除相应的键;如果返回其他值,则将该值插入到结果中。在将日期字符串转换为Date对象时,经常要用到还原函数,例如:
var book = {
"title": "Professional JavaScript",
"authors": [
"Nicholas C. Zakas"
],
edition: 3,
year: 2011,
releaseDate: new Date(2011, 11, 1)
};
var jsonText = JSON.stringify(book);
alert(jsonText);
var bookCopy = JSON.parse(jsonText, function(key, value){
if (key == "releaseDate"){
return new Date(value); //字符串还原成Date对象
} else {
return value;
}
});
alert(bookCopy.releaseDate.toISOString());