在这个例子中,创建了一个对象,它只包含一个成员“bindings”。“bindings”中有一个包含了3个对象的数组,而这每个对象都有“ircEvent”、“method”、“regex”3个成员。
2.2 示例二
按照最简单的形式,可以用下面这样的JSON表示名称/值对:
这个示例非常基本,而且实际上比等效的纯文本名称/值对占用更多的空间:
但是,当将多个名称/值对串在一起时,JSON就会体现出它的价值了。首先,可以创建包含多个名称/值对的记录,比如:
从语法方面来看,这与名称/值对相比并没有很大的优势,但是在这种情况下,JSON更容易使用,而且可读性更好。例如,它明确地表示以上三个值都是同一记录的一部分,花括号使这些值有了某种联系。
2.3 值的数组
当需要表示一组值时,JSON不但能够提高可读性,而且可以减少复杂性。例如,假设你希望表示一个人名列表。在XML中,需要许多开始标记和结束标记;如果使用JSON,就只需将多个花括号的记录分组在一起:
- 15 -
JSON相关文档
这不难理解,在这个示例中,只有一个名为people的变量,值是包含三个条目的数组,每个条目是一个人的记录,其中包含名、姓和电子邮件地址。上面的示例演示如何用括号将记录组合成一个值。当然,可以使用相同的语法表示多个值(每个值包含多个记录):
这里最值得注意的是,能够表示多个值,每个值进而包含多个值。但是还应该注意,在不同的主条目(programmers、authors 和 musicians)之间,记录中实际的名称/值对可以不一样。JSON 是完全动态的,允许在 JSON 结构的中间改变表示数据的方式。
在处理 JSON 格式的数据时,没有需要遵守的预定义的约束。所以,在同样的数据结构中,可以改变表示数据的方式,甚至可以以不同方式表示同一事物。
3 JSON的使用
3.1 JSON官方网站提供的一个开源的JSON解析器和字符串转换器:json.js
String.parseJSON()解析函数,它将JSON文本解析称object或者array,可以抛出一个语法错误的异常;
Array.toJSONString(), boolean.toJSONString(), date.toJSONString(), number.toJSONString(), object.toJSONString(), string.toJSONString()这几个函数可以生成JSON文本。
下面是一些简单的解析和转换的例子:
- 16 -
JSON相关文档
结果是01
结果是[“0”,”1”]
3.2 在JavaScript中使用JSON
JSON以一种特定的字符串形式来表示 JavaScript 对象。如果将具有这样一种形式的字符串赋给任意一个 JavaScript 变量,那么该变量会变成一个对象引用,而这个对象就是字符串所构建出来的,好像有点拗口,我们还是用实例来说明。
3.2.1 将JSON数据赋值给变量
例如,可以创建一个新的 JavaScript 变量,然后将 JSON 格式的数据字符串直接赋值给它:
这非常简单。现在people包含前面看到的JSON格式的数据,但是,这还不够,因为访问数据的方式似乎还不明显。
3.2.2 访问数据
尽管看起来不明显,但是上面的长字符串实际上只是一个数组;将这个数组放进 JavaScript 变量之后,就可以很轻松地访问它。实际上,只需用点号表示法来表示数组元素。所以,要想访问 programmers 列表的第一个条目的姓氏,只需在JavaScript 中使用下面这样的代码:
- 17 -
JSON相关文档
注意,数组索引是从零开始的。所以,这行代码首先访问 people 变量中的数据;然后移动到称为 programmers 的条目,再移动到第一个记录([0]);最后,访问 lastName 键的值。结果是字符串值“McLaughlin”。
下面是使用同一变量的几个示例。
利用这样的语法,可以处理任何JSON格式的数据,而不需要使用任何额外的JavaScript工具包或API。
3.2.3 修改JSON数据
正如可以用点号和括号访问数据,也可以按照同一的方式轻松地修改数据:
在将字符串转换为JavaScript对象之后,就可以像这样修改变量中的数据。
3.2.4 转换回字符串(见5.3小节)
当然,如果不能轻松地将对象转换回文本格式,那么所有数据修改都没有太大的价值。在JavaScript中这种转换也很简单:
这样就行了。现在就获得了一个可以在任何地方使用的文本字符串,例如,可以将它用作Ajax应用程序中的请求字符串。
更重要的是,可以将任何JavaScript对象转换为JSON文本。并非只能处理原来用JSON字符串赋值的变量。为了对名为myObject的对象进行转换,只需执行相同形式的命令。
如果使用JSON,只需调用一个简单的函数,就可以获得经过格式化的数据,可以直接使用了。
最终结论是:如果要处理大量JavaScript对象,那么JSON几乎肯定是一个好选择,这样就可以轻松地将数据转换为可以在请求中发送给服务器端程序的格式。
3.3 将JSON发给服务器
将JSON发给服务器并不难,但却至关重要,而且还有一些重要的选择要做。但是,一旦决定使用JSON,所要做的这些选择就会十分简单而且数量有限,所以你需要考虑的关注
- 18 -
JSON相关文档 的事情不多,重要的是能够将JSON字符串发送给服务器,而且最好能做到尽快和尽可能简单。
3.3.1 通过GET以名称/值对发送JSON
将JSON数据发给服务器的最简单方法是将其转换成文本,然后以名称/值对的值的方式进行发送。请务必注意,JSON格式的数据是相当长的一个对象,看起来可能会如清单1所示:
清单1. JSON格式的简单JavaScript对象
如果要以名称/值对将其发送到服务器端,应该如下所示:
这看起来不错,但却存在一个问题:在JSON数据中会有空格和各种字符,Web浏览器往往要尝试对其继续编译。要确保这些字符不会在服务器上(或者在将数据发送给服务器的过程中)引起混乱,需要在JavaScript escape()函数中做如下添加:
该函数可以处理空格、斜线和其他任何可能影响浏览器的内容,并将它们转换成 Web 可用字符(比如,空格会被转换成 ,浏览器并不会将其视为空格处理,而是不做更改,将其直接传递到服务器)。之后,服务器会(通常自动)再把它们转换回它们传输后的本来 “面目”。
这种做法的缺点有两个:
(1) 在使用 GET 请求发送大块数据时,对 URL 字符串有长度限制。虽然这个限制很宽泛,但对象的 JSON 字符串表示的长度可能超出您的想象,尤其是在使用极其复杂的对象时更是如此。
(2) 在跨网络以纯文本发送所有数据的时候,发送数据面临的不安全性超出了您的处理能力。
简言之,以上是 GET 请求的两个限制,而不是简单的两个与 JSON 数据相关的事情。在想要发送用户名和姓之外的更多内容,比如表单中的选择时,二者可能会需要多加注意。若要处理任何机密或极长的内容,可以使用 POST 请求。
- 19 -
JSON相关文档
3.3.2 利用POST请求发送JSON数据
当决定使用POST请求将JSON数据发送给服务器时,并不需要对代码进行大量更改,如下所示:
请求使用POST而非GET打开,而且Content-Type头被设臵为让服务器预知它能得到何种数据。在这种情况下,即为