JSON之所以流行,拥有与JavaScript类似的语法并不是全部原因。更重要的一个原因是,可以把JSON数据结构解析为有用的 JavaScript对象。与XML数据结构要解析成DOM文档而且从中提取数据极为麻烦相比,JSON可以解析为JavaScript对象的优势极其明 显。
JSON对象早期的JSON解析器基本上就是使用JavaScript的eval()函数。由于JSON是JavaScript语法的子集,因此eval()函 数可以解析、解释并返回JavaScript对象和数组。ECMAScript 5对解析Json的行为进行规范,定义了全局对象JSON。支持这个对象的浏览器有IE8+、Firefox 3.5+、Safari4+、Chrome和Opera10.5+。对于较早版本的浏览器可以使用一个shim:https://github.com /douglascrockford/JSON-js。在旧版本的浏览器中,使用eval()对JSON数据结构求值存在风险,因为可能会执行一些恶意代 码。对于不能原生支持JSON解析的浏览器,使用这个shim是最佳的选择。
JSON对象有两个方法:stringify()和parse()。在最简单的情况下,这两个方法分别用于把JavaScript对象序列化为JSON字符串和把JSON字符串解析为原生JavaScript值。例如:
var book = { title: "Professional JavaScript", authors: ["NIcholas C. Zakas"], edition: 3, year: 2011};var jsonText = JSON.stringify(book);这个例子使用JSON.stringify()把一个JavaScript对象序列化为一个JSON字符串,然后将它保存在变量jsonText 中。默认情况下,JSON.stringify()输出的JSON字符串不包含任何空格字符或缩进,因此保存在jsonText中的字符串如下所示:
{"title":"Professional JavaScript","authors":["NIcholas C. Zakas"],"edition":3,"year":2011}在序列化JavaScript对象时,所有函数及原型成员都会被有意忽略,不体现在结果中。此时,值为undefined的任何属性也都会被跳过。结果中最终都是值为有效JSON数据类型的实例属性。
将JSON字符串直接传递给JSON.parse()就可以得到相应的JavaScript值。例如,使用下列代码就可以创建与book类似的对象:
var bookCopy = JSON.parse(jsonText);注意,虽然book与bookCopy具有相同的属性,但它们是两个对立的、没有任何关系的对象。
如果传给JSON.parse()的字符串不是有效的JSON,该方法会抛出错误。
实际上,JSON.stringify()除了要序列化的JavaScript对象外,还可以接收另外两个参数,这两个参数用于指定以下不同的方式序列化JavaScript对象。第一个参数是个过滤器,可以是一个数组,也可以是一个函数;第二个参数是一个选项,表示是否在JSON字符串中保留缩进。单独或组合使用这两个参数,可以更全面深入地控制JSON的序列化。
1.过滤结果如果过滤器参数是数组,那么JSON.stringify()结果中将只包含数组中列出的属性。来看下面的例子。
var book = { "title": "Professional JavaScript", "authors":