JOSN 对象
早期的JSON解析器基本上就是JavaScript的eval()函数。由于JSON是JavaScript语法的子集,因此eval()函数可以解析,解释并返回JavaScript对象和数组。ECMAScript5对解析JSON的行为进行规范,蒂定义了全局对象JSON。使用eval()对json数据结构求值存在风险,因为可以能会执行一些恶意代码。 对于不能原生支持JSON解析的浏览器,使用这个shim的最佳选择。
JOSN对象有两个方法:stringify()和parse()。在最简单的情况下,这两个方法分别用于把JavaScript对象序列化为JSON字符串和把JSON解析到原生JavaScript值。
var book = {
title:"Pro Javascript",
year:2011,
edition:3
} //{"title":"Pro Javascript","year":"2011","edition":"3"}
var jsonText = JSON.Stringify(book);
//JSON.stringify()把一个JavaScript对象序列化为一个JSON字符串,然后将他保存在变量jsonText
var bookCopy = JSON.parse(jsonText);
//将JSON字符串直接传递给JSON.parse()就可以得到相应的JavaScript值。
//虽然book和bookcopy具有相同的属性,但他们是两个独立的没有任何关系的对象。如果传给json.parse()
//不是有效的JSON,该方法会抛出错误。
toJSON( )方法
有的时候,JSON.stringify()还是不能满足对某些对象进行自定义序列化的需求。在这些情况下。可以给对象定义toJSON()方法,返回其自身的json数据格式。原生Date对象有一个toJSON()方法,能够将JavaScript的date对象自动转换成ISO8601日期字符串(与Date对象调用toISOString()的结果是一样的)。可以给任何对象添加toJSON( )方法。
toJSON()可以作为函数过滤器的补充,因此理解序列化的内部顺序十分重要。假设把一个对象传入JSON.stringify().序列化该对象的的顺序如下:
1,如果存在toJSON()方法而且能够通过它取的有效的值,则调用该方法。否则,返回对象本身。
2,如果提供第二个参数,应用这个函数的过滤器。传入函数过滤器的值是第(1)步返回的值。
3,对第二步返回的每个值进行相应的序列化。
4,如果提供了第三个参数,执行相应的格式化。
无论是考虑定义toJSON()方法,还是考虑使用函数过滤器,亦或需要同时使用两者,理解这个顺序都是至关重要的。