Javascript高级程序设计第20章(JSON)

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());




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值