使用JSON

JSON是一种用于数据交换的文本格式。其作用是提供结构化数据的一种表示,而不依赖于所用的语言和平台。使用这种格式,可以在不同语言编写的应用程序之间交换数据,而且可以在不同机器上运行应用程序。与XML相比(这可能是最著名的数据交换格式),JSON的语法很简洁。这说明,通过网络传输JSON数据通常需要更少的带宽。

JSON建立在JavaScript语言的一个子集的基础上。因此,其编码和解析很直接。由于绝大多数Ajax开发人员同时也是JavaScript开发人员,所以JSON几乎没有什么学习曲线。

3.2.1 JSON结构

JSON的基础包括两个结构:一个名值对集合,称为对象(object),以及一个有序的值列表,称为数组(array)。在JSON中,值(value)可以是以下某种形式:

对象

数组

数字

true

false

null

对象表示为JavaScript对象字面量,数组表示为JavaScript数组字面量,余下的值也由相应的字面量表示。

由于JSON是JavaScript字面量的一个子集,语法方面存在一些限制。在一个JSON对象中,名值对中的名部分必须是一个字符串,而值部分必须是得到支持的某种值。以下是一个对象的JSON表示,该对象包含两个属性:


属性名(firstName和lastName)必须是串,而且必须包围在双引号中。下面的代码表示了一个类似的对象,将前面的代码与之做一个比较:

在JavaScript中,这两个对象有相同的结构。不过,第二个对象不是一个合法的JSON表示,因为属性名没有包围在双引号中。

JSON数组也存在一些限制,数组中的元素必须是得到支持的值。例如,Date对象不在支持的值之列,所以不能作为JSON数组的元素或JSON对象的一个属性。String与JavaScript字符串字面量有相同的表示,不过串必须用双引号包围。Number类似于JavaScript数字字面量,不过八进制和十六进制格式未得到支持。下面是一个JSON数组的例子:


布尔值(true和false)和null与相应的JavaScript字面量有相同的表示。

说明 方法不能使用JSON表示,因为JSON语法中不包括函数字面量。另外,JavaScript的new操作符也不是JSON语法的一部分,不能在对象或数组中使用。

JSON的优点之一是它易于解析。已经为许多语言编写了很多JSON解析器,它们可以自动完成JSON的生成和解析。(在JSON官方网站上可以找到这些解析器的一个列表,见http://json.org/)在JavaScript中,解析过程相当直接,所要做的只是将JSON串传递给JavaScript eval 函数。如果有一个包含JSON数据的jsonString变量,以下代码将解析这个变量,并返回相应的JavaScript对象:


注意,在调用eval之前要把JSON数据用括号括起。这样就要求eval将参数看作为一个表达式,而不会把对象字面量{}解释为一个代码块。不过eval函数可以执行任意的代码,如果数据来自一个不可信的来源,可能会导致安全问题。出于这个原因,一般建议在调用eval函数之前先验证JSON数据。

说明 JSON官方网站(http://json.org/)提供了一个验证JSON数据的正则表达式。可以在从该网站下载的JavaScript实现中找到这个正则表达式。

Microsoft Ajax Library有自己的JavaScriptSerializer对象,包含在Sys.Serialization命名空间中,这个对象负责JSON数据的编码和解码。下面来看它是如何工作的。

posted on 2009-07-20 00:30  钱途无梁  阅读(3423)  评论(0编辑  收藏  举报