function myHandler() {
if (req.readyState == 4 /*完成*/) {
//用第一个街道地址更新表单中的地址域
var addrField = document.getElementById('addr');
var root = req.responseXML;
var addrsElem = root.getElementsByTagName('addresses')[0];
var firstAddr = addrsElem.getElementsByTagName('address')[0];
var addrText = fistAddr.firstChild;
var addrValue = addrText.nodeValue;
addrField.value = addrValue;
}
}
注意,你不必自己分析XML文档,分析任务可以由XMLHttpRequest对象为你自动完成。之后,这个XMLHttpRequest对象使得由分析生成的DOM树可应用于responseXML属性中。然后,你可以借助这个responseXML属性并调用getElementsByTagName方法来查找文档中的addresses部分,但仅能使用找到的第一个(其实只有一个)。然后,你再次在找到的address上调用getElementsByTagName方法来查找下一层中的第一个address元素,然后再次使用找到的第一个address……然后,你得到该元素的第一个DOM子结点(它是一个文本结点)并得到该结点的值(它正是你想找的街道地址)。最后,你就可以在表单域中显示它。
显然,这是一项工作量很大的工作!现在,让我们试用一下JSON:
function myHandler() {
if (req.readyState == 4 /*complete*/) {
var addrField = document.getElementById('addr');
var card = eval('(' + req.responseText + ')');
addrField.value = card.addresses[0].value;
}
}
你需要做的第一件事情是手工地分析JSON响应。然而,因为JSON是JavaScript的一个子集,所以你可以通过调用eval方法使用JavaScript自己的编译器来完成这些。分析JSON是非常简单的!而且,在产生于JSON中的一个对象中导航与在任何JavaScript对象中导航完全一样。这比在DOM树中导航要容易得多。例如:
•card.addresses[0].value对应第一条街道地址:“1234 Main Stb &”;
•card.addresses[0].type对应地址的类型:“work”;
•card.addresses[1]对应一个家庭地址对象;
•card.fullname对应卡片名:“Sean Kelly”。
如果仔细观察,那么你可能注意到,示例程序的XML版本至少要处理包含在文档中的一个对象—根文档元素card。这在JSON版本中是不存在的。为什么?如果你曾开发过存取一个Web服务的JavaScript,那么你就会知道你要从Web服务中取回什么。然而,你可以在JSON中包括下面一种更为简练的形式:
{"card": {"fullname": ...}}
通过使用这一技术,你的JSON文件总是以一个对象开头并且用单个命名的属性来标记该对象的“类型”。
四、JSON的快速可靠性
JSON能够生成更小的文档,且其在JavaScript脚本中更易于使用。XMLHttpRequest能够为你自动分析XML文档,然而你必须手工分析JSON。这样以来,你可能质疑:分析JSON是否比分析XML更慢?对比JSON,我针对上面的地址卡测试了嵌入到XMLHttpRequest中的XML分析器—通过把这些数据置入上千次的循环中。最终结果表明,分析JSON比分析XML快大约10倍!如果想实现AJAX程序的行为类似于桌面应用程序,那么速度就是一切。很明显,JSON是胜者。
当然,你不可能一直控制为你的AJAX应用程序产生数据的服务器端。你可以使用一种第三方服务器来处理你的数据,而且让该服务器仅提供XML输出。然而,如果该服务器中恰巧能够提供JSON支持,那么你能否确定并敢于使用这一支持?
注意,在上面的示例中,你是直接把响应文本传递到一个对eval的调用中。如果你信任并控制了服务器,这是没有问题的;然而,另外一些情况下,一个恶意的服务器有可能给你的浏览器执行带来危险操作。为此,你最好使用一个用JavaScript编写的JSON分析器。幸好,已经存在可用的分析器了。
谈到分析器,Python迷们可能还没有注意到,JSON不仅是JavaScript的一个子集,而且它还是Python的一个子集。你可以直接在Python中使用JSON,或利用一种安全的JSON分析器。现在,针对于JSON的分析器也大量地存在于其它语言中;你可以参考JSON.org网站来选择使用相应的分析器。
五、服务器端技术对JSON的支持
到目前为止,我们一直集中于讨论如何把JSON应用于客户端浏览器上的基于AJAX技术的Web应用程序。当然,Web服务器端必须存在一定的技术支持才能实现首先生成JSON,然后由客户端使用JSON。幸好,基于现有数据结构创建JSON是一件相当直接的事情。另外,一些Web应用程序框架(例如TurboGears)已经自动包括支持JSON输出。
另外,商业Web服务供应商也都特别关注JSON。Yahoo最近在其Web服务中大量地加入对JSON的支持。Yahoo的多种搜索服务,旅行规划者,del.icio.us和高速公路交通服务都支持JSON输出。无疑,其它一些主要的Web服务供应商也都会逐渐地提供对JSON的支持。
六、结论
JSON的基本思想是,把自己实现为JavaScript(和Python)的一个子集,从而使其成为一种轻量级的和高度灵活的处理AJAX数据交换的方式。与传统的XML处理技术相比,这个工具的分析速度更快且更为易用。从该工具的性能和使用现状来看,它有可能会成为下一代Web 2.0开发中XML数据操作的主要替代者。任何开发者,无论是开发标准桌面应用程序还是开发Web应用程序,只要使用XML数据处理,都会欣赏JSON的简易特征。最后,我衷心祝愿JSON能加快你的基于AJAX技术的Web 2.0应用程序的开发。
()