文档库 最新最全的文档下载
当前位置:文档库 › 在 Android 上使用 XML 和 JSON

在 Android 上使用 XML 和 JSON

在Android上使用XML和JSON

移动设备和平台吹嘘每个新版本都有更多特性和功能,并且仅仅数月重要通告就从主流移动设备提供商中分离出来了。标题多数是关于UI特性(例如先进的多点触摸功能和Adobe?Flash?技术)以及硬件提升(例如,处理器速度和存储容量)。但是至关重要的仍然是“内容为王”。内容—或者,一般来说,是数据—在应用程序、服务器、移动设备和用户之间不停地被交换。智能手机,如Apple的iPhone和Google的Android只是标价过高且表现不佳的移动电话,而且也不能很好的工作。

常用缩略语

?API:应用程序编程接口

?DOM:文档对象模型

?HTML:超文本标记语言

?IDE:集成开发环境

?SAX:XML简单API

?SDK:软件开发工具包

?UI:用户界面

?XML:可扩展标记语言

考虑到社会网络非比寻常的成功,例如:Facebook、LinkedIn和Twitter。单从特征和功能的角度来说,这些平台很大程度上都是单调的,之所以流行是因为会员和网站访问者可以从其公布的内容获益。而且,其内容逐渐可以通过移动设备访问。

这篇文章主要说明Android平台上XML和JSON数据交换格式的使用。对于一个Twitter帐户,示例应用程序数据源是一个状态更新feed。Feed数据可以以XML和JSON格式从Twitter上获取。正如您所看到的,操作数据的程序设计方法在这两种格式中明显不同。

建议您安装Android SDK version1.5或最新版以及Eclipse来运行本文附带的示例代码。为了了解更多关于设置环境的知识,访问Android Developers网站。使用一个活动的帐户跟着示例练习是很重要的,但不是必须的。相关链接见参考资料。

首先我们来简要的看一下这两个数据格式,从XML开始。如果您对XML和JSON已经很熟悉了,就可以跳转到应用机会:Twitter feeds在Android上开始运行。

XML:一个老朋友

不再是苦役

当您将XML与XML普遍应用之前的工艺水平进行比较时,XML的自述特性是很清楚的。此外,数据交换练习包括繁琐的数据描述文档,通常是在一个文字处理器或电子表格应用程序中手工编写的。这些文档,通常称为接口规范,描述了字段名、长度、分隔符、层次结构等等。用户采用他们认为合适的实践;最接近标准的是熟悉的逗号分隔值(CSV)模式,尽管CSV文件变化很大。如果您怀疑这一点,试着将一个CSV文件导入电子表格应用程序,并且注意所有可用选项。

事实上,近几年来为企业、web或移动市场编程的人都遇到过XML,几乎您见到的每个地方都有。

一个XML文档有一个可辨认的结构:一系列可以随意包含属性和子元素的元素。每个有效的XML文件第一行都有这样一个声明:。后面的内容根据应用程序而定。XML的好处就在于它的自述性。XML模式

尽管XML文档是自述的,但也必须遵循一定的规则和指导方针,这就需要XML模式,它是一个描述特定XML文件结构的文档。此类结构通常是冗长且复杂的。(值得争议的是,XML对IT领域最糟糕的贡献是,当高度描述的数据结构这一理念成为时尚时导致了数据爆炸,且这种情况由于过去十年中磁盘存储技术成本大幅降低而加剧。)

当这些大且复杂的文件变得更规范时,对程序员和分析员来说手工处理通常是不可能完成的。为了解决这个问题,XML 编辑器和验证工具可以在文件和相关的任务管理方面给予帮助。例如,文档和遗留格式转换。

除了一般的文本数据,XML过去常用于存储二进制数据,通过一个称为CDATA的特殊标记集合实现。一个XML文档中的CDATA标记可能含有各种数据,包括其他标记文本,假设该文本本身不含有CDATA。

通过使用XML作为一个结构来执行请求/响应查询,这并不是API使用该功能的常用方式。响应数据经常包含一个包含在CDATA标记中的XML结构。例如,一个API调用可能使用一个姓氏Mott来请求一个客户记录。数据找到时,封装到一个XML结构中并将其置于响应元素中,如清单1所示:

工作空间中的XML

今天,XML是默认的、预定数据格式。尽管同一数据的其他格式也可用,但基于XML结构的可用性进行计划是一种最安全的方式。

Enterprise Resource Planning(ERP)包频繁使用XML进行数据到任务的导入和导出。Internet新闻网站经常将数据

提供为Really Simple Syndication(RSS)—具有新闻阅读软件可以处理的预定义格式的XML文档。甚至文字处理应用程序(例如https://www.wendangku.net/doc/886782913.html,和Microsoft?Office)也使用XML。

现在的Microsoft Office文件是PKZIP兼容的,含有多个XML文档。每个XML在第一行都有这个常见声明。正如您在清单2所看到的,阅读这些属性可能有点难:

清单2.每个文件第一行的常见声明

XML是自述的,但是并不意味着标记一定是容易理解的。这个虚构的示例展示了多个名称空间的使用,多个名称使得理解XML文件更有挑战性,如果不使用专用工具就很难理解。

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.(这是我们虚构的)的联系记录,应用程序返回浏览器的数据元素不止一个。它是如何包装的呢?在清单1示例中,您可以使用一个简单的请求/响应结构。这已经足够了;然而它要求您解析来自服务器的每个响应、以某种结构(DOM)存储数据,然后更新网页内容。

还有一种选择,您可以从服务器上返回一些JavaScript,并用它来直接处理。以下是一个虚拟应用程序的样例响应,对Mott查询(http://

XML以其冗长而著名,而JSON也因其难度而闻名。JSON对象其构造是一个键:值对,对象元素之间用逗号隔开,每个对象被包含在一对大括号{}内。一组对象数组包含在一对方括号中。这是将数据行从一个数据库发送到一个对象数组的一种常见方法。其中每个数组元素对应数据库中的一行,每个对象属性代表数据的一列。

清单3显示了一个在HTML页面中使用这类对象的示例。为简单起见,不包括服务器通信;相反,JSON数据作为一个字符串变量serverresponse提供。

清单3.在HTML页面中使用一个JSON对象

注意,这个示例使用JavaScript函数eval()将字符串转换成一个JavaScript数组。JSON库可以为执行该步骤提供更快更安全的方法,清单3中的方法并不是最佳实践。在这只是提供了一个JSON对象,如何用于Ajax应用程序的背景:JSON结构可被客户端代码交换、解析和操作。

总的来说,JSON是:

?一种数据交换格式。

?JavaScript对象作为字符串编码的一种方式。

?仅限于文本和数值。二进制值是明确不允许的。JSON没有CDATA对应模式。

?在数据可读性费用方面、就数据大小而言比XML更经济。

?越来越多的API供应商将其作为一种选择,例如Twitter。

在清单3中,客户端是一个运行客户端脚本的web浏览器。返回本文主题,接下来将研究在Android应用程序中XML和JSON的使用。

回页首

应用机会:Twitter feeds

Twitter现在已经变成了一种国际力量,它提供的更新包罗万象:从什么人正在吃早饭,他们的孩子的球队在棒球比赛中的表现这类琐事,到封闭国家中的政治动乱的街头新闻,器官移植实时报道等严肃话题。

要获取一些XML和JSON文档以用于本文附带的样例代码,最简单的方法就是通过URL https://www.wendangku.net/doc/886782913.html,/statuses/user_timeline/userid.format,其中userid是您的Twitter用户ID,format是您要的格式:XML或JSON。

您也可以直接在您的Twitte页面上找到此页的链接,如图1所示。在那里可以看到您的Twitter用户ID。

图1.您Twitter页面上的feed页链接

完整的feed文件相当冗长,下面两个清单只显示feed的第一项(来自我的Twitter帐户)。清单4包含以下XML片段:

清单4.XML片段

清单5是同一数据,这次是以JSON格式显示:清单5.JSON格式的feed数据

注意,在两个清单中除了状态更新外还有非常多附加数据。您只需要注意日期/时间,何时发布公告以及公告的内容。接下来,将向您展示解析该数据的Android应用程序的相关部分。整个项目见下载部分。

回页首XMLvsJSON应用程序

真实的实时更新

需要注意的是,样例应用程序没有实时地从web移动数据,尽管我们期盼一个真实应用程序。由于数据feeds取自原始资源文件夹,因此应用程序关注的是分析方面。关于使用Android进行网络连接相关信息的链接,见参考资料。Android应用程序很简单。其中包含XML和JSON数据资料的全部副本。用户可以任选其一进行分析。图2显示Eclipse中项目文件的结构。(查看图2的文本版本。)

图2.Eclipse项目的文件结构

图3显示选择解析选项之前的应用程序UI:图3.选择解析选项之前的应用程序UI

应用程序UI有两个按钮,Parse XML和Parse JSON,接着是默认文本。清单6包含该UI的布局,在项目的res/layout文件夹中的main.xml中可以找到:

清单6.UI的布局

Parse XML和Parse JSON file按钮是在ScrollView之上定义的,ScrollView中含有一个TextView控件。这里的意思是想要用户可以滚动结果数据。

注意多个LinearLayout结构的使用。第一个是垂直对齐,其中既含有一个带有水平结构的LinearLayout和一个ScrollView。内层LinearLayout含有两个Button小部件。这个布局很冗长,一般在onCreate()方法中调用,见清单:

清单7.onCreate()方法

examineXMLFile()方法控制XML解析。

回页首XML解析

SAX对DOM

Android也支持一个DOM解析器,这需要占用较大的内存空间,但是降低在SAX解析器中的复杂性。对于XMLvsJSON这个应用程序,仅仅对大数据资源很小的一个子集感兴趣,SAX方法可能是处理作业的最好工具。XML数据解析通常是使用一个SAX风格的解析器完成的。对于这类解析器,您可以建立一个InputSource指向源XML数据,并在文档“运行”时提供一个接收某些事件的处理程序。清单8展示examineXMLFile()方法,执行以下任务:

?使用原始资料中的XML文件建立InputSource

?创建一个SAXParser,关联处理程序twitterFeedHandler(见清单9)

?调用解析器,在TextView小部件中显示结果,在布局文件中作为R.id.txtData识别,在代码中作为tvData 引用

?如果有错误,也显示在TextView中

清单8.examineXMLFIle()方法

虽然examineXMLFile()设置好了一切,但应用程序角度来看,真正的解析工作实际是在处理程序中进行的,该处理程序是在twitterFeedHandler.java文件中实现的。实现DefaultHandler接口的类见清单9:

清单9.twitterFeedHandler类

清单9中有一些值得注意的细节,首先考虑到的是SAX解析器是一个基于事件的解析器,这就意味着使用SAX进行解析时要建立真实文件。在文档开始和结束、标记开始和结束、发现数据时,事件被触发。这意味着您必须定义一个数据结构来保留感兴趣的数据、抛弃余下的。

注意,使用StringBuilder和附加数据是因为一个特定数据在InputSource上能通过多个读取来进行处理。千万不要以为所有数据都在给定的调用characters()方法中提供。

应用程序将数据收集到一个简单的格式化字符串中。而另一个示例中则是把这些实体放在一个集合类或数据库中,特别是如果有大量的操作都发生在解析之后。

getResults()方法是该类特有的,用来收集这类数据的集中表示法,并将其提供给应用程序,这不是DefaultHandler接口的一部分。

图4展示了已解析的XML数据。(查看图4的文本版本。)

图4.已解析的XML数据

尽管从构建、管理和导航结果结构方面来说,使用SAX解析器解析XML数据并不容易,但其主要优势是快速和极大地减少了解析过程中和解析之后的RAM需求数量。

现在看一下Android解析JSON数据的方法。

回页首JSON解析

在用户选择JSON按钮时解析JSON数据就开始了。调用examineJSONFile()方法,如清单10所示。不需要额外的处理类。因为所有解析和文档管理都在Android提供的库中进行,所有JSON相关的代码都包含在这个方法中。

清单10.调用examineJSONfile()方法

像之前显示的XML例程一样,代码是从原始资源文件夹的文件中读取的。数据被整体读到内存中,转换成一个https://www.wendangku.net/doc/886782913.html,ng.String,然后解析成JSONArray。要注意的是,正如此例所示,一个特殊的字符串能直接解析成一个数组,或者也可以直接解析成一个JSONObject。因为Twitter数据是一个对象数组,整体解析成一个数组然后按顺序逐个访问对象是明智的选择。

该方法的流程简单明了,一旦数据被解析,代码建立一个类似于XML解析器处理程序方法的字符串表示。有趣的是数据将由您来管理;您不需要建立额外内存结构来容纳数据,同样地,应用程序预先就知道在JSONArray中有多少个条目(在这个例子中是20个)。

尽管JSON解析在编程上简单得多,但并不是没有代价的。它要增加内存消耗,在处理之前整体读取数据流并进行存储。相反的,SAX XML方法仅使用相关数据。另外,如果解析特殊JSON对象的内存是足够的,则这个方法将很受应用程序欢迎,特别是,几乎不需要使用DOM的应用程序。

回页首结束语

本文在Android应用程序背景下介绍了XML和JSON数据交换格式。比起JSON方法,XML方法更快、内存受限更小—但是以增加复杂性为代价。在第二部分,我将介绍一些结合使用JSON方法的先进技术,例如,基于WebKit 的WebView小部件,并为Android应用程序定制动态应用程序逻辑。

要运行本文的示例代码,应该安装Android SDK1.5或更晚版本和Eclipse。要进一步学习如何设置环境,请访问

Android Developers网站。参见参考资料中的链接。

简介

难以想象还有哪种技术比移动电话更流行。大量的平台在销售和心理份额方面争占此行业的顶级市场。设备是高级的工程样品,真正让它们流行起来的动力在于这些平台上可用的大量应用程序带来的用户体验。具体来说,iPhone和Android平台是最新的设备,点燃了人们的消费欲望。

常用缩略语

?API:应用程序编程接口

?CSS:层叠样式表

?HTML:超文本标记语言

?IDE:集成开发环境

?SDK:软件开发工具包

?UI:用户界面

?XML:可扩展标记语言

对移动用户可用的大部分应用程序是由移动开发人员通过各平台供应商提供的核心SDK编写的。移动设备的流行离不开大量天才的web技术程序员,过去十年间,他们在Web上大获成功,现在又开创了一种新型的应用程序—混合应用程序,即既使用web浏览器接口又使用本地移动组件的应用程序。针对iPhone和Android都存在混合应用程序,不过本文的重点放在Android混合应用程序及JavaScript和JSON的使用上。

混合应用程序是用Android的WebView控件中的WebKit引擎构建的。这是一个用户界面小部件,它向Android程序员提供WebKit的功能。此控件可用于在应用程序中呈现远程web页面,以便为开发人员和用户等提供熟悉的用户界面体验,以及在本地Android应用程序中利用强大且灵活的JavaScript环境。

本系列其他文章

?在Android上使用XML和JSON,第1部分:在Android应用程序上研究JSON和XML益处

混合应用程序通常利用WebView小部件来为用户界面元素充分利用WebKit的优势,但是混合应用程序不仅仅是简单地在小部件中显示一些HTML。混合应用程序是多才多艺的—Android SDK中包含的广泛功能加上HTML、CSS和JavaScript等web技术,使得混合应用程序的功能不可限量。为了实际了解混合应用程序的概念,本文将介绍一个名为AndroidJSON的样例应用程序,它实现了Activity、WebView和JSON之间的很多交互,以交换数据。该应用程序演示了Activity和WebView宿主的HTML及JavaScript之间的很多交互,主要特性是一个JavaScript计算器。首先,我们来看直接在Android应用程序中嵌入一个WebKit引擎。

回页首嵌入在Android中的JavaScript计算器

大部分基于SDK的Android应用程序都包含Activity类的一个或多个实现。Activity类本质上是一个屏幕或页面,其中包含由应用程序用户体验的用户界面元素。

Activity显示一组由程序员定义的用户界面元素,比如按钮、标签、文本输入框、单选按钮列表,等等。所有预期的条目都可在Android SDK中找到。除了这些用户界面元素之外,还有一个特殊的小部件,就是WebView。

JavaScript计算器演示了Activity的Java环境和WebView的JavaScript环境之间相辅相成的关系。应用程序不仅仅是要求WebView显示HTML内容—它实际上是连接Java环境,以向JavaScript环境提供功能,这样可以将两者紧密地集成在一起,从而带来独特的用户体验。一旦两个环境连接起来,就可以JSON形式交换数据,以交付各种特性,本文将全面解释这些特性。我们首先来看JavaScript计算器如何利用WebView小部件。

在深入应用程序是如何构造的细节之前,先花点时间回顾一下应用程序的各种特性。图1展示了应用程序屏幕。

图1.展示正在工作的JavaScript计算器

相关文档
相关文档 最新文档