XML 随处可见,但是对于 Android 程序员来说并不是一个明智的选择,特别是,如果数据结构成为与 XML 结构伴随着的数据爆炸的牺牲品。像 Android 这样通常在蜂窝数据网络(cellular data network)上工作的资源受限平台不能存储和解析大量 XML 数据。然而,如果特殊编程任务要求文本和二进制数据交换,那么 XML 是一个可靠的选择。
现在,让我们看一看数据交换的另一个格式:JSON。
JSON:网络的新成员越来越多的 Internet API 供应商提供 JSON 作为一种数据格式。JSON 在 Ajax (Asynchronous JavaScript and XML) 网页编程社区中享有盛名。Ajax 技术使 web 页面可以动态地更新,只更新所选区域的数据而不用更新整个页面。由于较少数据被传送 — 更重要的是,因为较少的数据被解析且显示在浏览器窗口 — 使用 AJAX 的应用程序比起传统 web 应用程序能够提供一个更好的用户体验。事实上,一个结构良好的 Ajax 应用程序可与智能或富客户端应用程序相抗衡。
当 Ajax 应用程序与 web 服务器交换数据时,经常需要某类数据的刷新,但不需要格式化。通常认为一个 web 服务器提供预格式化(preformatted)HTML 是一个糟糕的实践。相反的,一个格式良好的应用程序应该将数据内容发送到浏览器并应用一个 Cascading Style Sheets (CSS) 文件来产生视觉效果,比如颜色和特殊字体。
假设应用程序想要请求 Mr. Mott.(这是我们虚构的)的联系记录,应用程序返回浏览器的数据元素不止一个。它是如何包装的呢?在 示例中,您可以使用一个简单的请求/响应结构。这已经足够了;然而它要求您解析来自服务器的每个响应、以某种结构(DOM)存储数据,然后更新网页内容。
还有一种选择,您可以从服务器上返回一些 JavaScript,并用它来直接处理。以下是一个虚拟应用程序的样例响应,对 Mott 查询(<yourserver/app/searchcontact?Mott)的响应。这个响应是一个 JavaScript 对象字符串表示 — 即 JSON 字符串(为了适应本文页宽在这分成两行):
[{"firstname":"Troy","lastname":"Mott","age":"don't ask!"},{"firstname":"Apple seed", "lastname":"Mott's","age":"99"}]
XML 以其冗长而著名,而 JSON 也因其难度而闻名。JSON 对象其构造是一个键 :值 对,对象元素之间用逗号隔开,每个对象被包含在一对大括号 {} 内。一组对象数组包含在一对方括号中。这是将数据行从一个数据库发送到一个对象数组的一种常见方法。其中每个数组元素对应数据库中的一行,每个对象属性代表数据的一列。
显示了一个在 HTML 页面中使用这类对象的示例。为简单起见,不包括服务器通信;相反,JSON 数据作为一个字符串变量 serverresponse 提供。
清单 3. 在 HTML 页面中使用一个 JSON 对象<html> <head> <script language="JavaScript"> var serverresponse = "[{\"firstname\":\"Troy\",\"lastname\":\"Mott\",\"age\":\"don't ask!\"},{\"firstname\":\"Apple seed\",\"lastname\":\"Mott's\",\"age\":\"99\"}]"; function updatepage() { var contacts = eval(serverresponse ); var i; var s = "Search Results:<br />"; for (i=0;i<contacts.length;i++) { s = s + contacts[i].firstname + " " + contacts[i].lastname + "'s age is ... " + contacts[i].age + "<br />"; } document.getElementById("target").innerHTML = s; } </script> </head> <body> <button>Search for Mott</button><br /> <span> </span> </body> </html>