Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 開發入門 >> 在 Android 上使用 XML 和 JSON,第 1 部分: 在 Android 應用程序上研究 JSON 和 XML 益處(一)

在 Android 上使用 XML 和 JSON,第 1 部分: 在 Android 應用程序上研究 JSON 和 XML 益處(一)

編輯:開發入門

簡介: 這個兩部分文章系列探索了在 android 平台上處理 Internet 上兩種最常見的數據格式 — XML 和 JavaScript Object Notation (JSON) — 的技術。第一部分介紹了 XML 和 JSON 的基礎概念,並展示了如何構建一個 android 應用程序,分析和顯示了這兩種格式的 Twitter 狀態更新 feed。

 

移動設備和平台吹噓每個新版本都有更多特性和功能,並且僅僅數月重要通告就從主流移動設備提供商中分離出來了。標題多數是關於 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 version 1.5 或最新版以及 Eclipse 來運行本文附帶的 示例代碼。為了了解更多關於設置環境的知識,訪問 android Developers 網站。使用一個活動的帳戶跟著示例練習是很重要的,但不是必須的。相關鏈接見 參考資料

首先我們來簡要的看一下這兩個數據格式,從 XML 開始。如果您對 XML 和 JSON 已經很熟悉了,就可以跳轉到 應用機會:Twitter feeds 在 android 上開始運行。

XML:一個老朋友

不再是苦役

當您將 XML 與 XML 普遍應用之前的工藝水平進行比較時,XML 的自述特性是很清楚的。此外,數據交換練習包括繁瑣的數據描述文檔,通常是在一個文字處理器或電子表格應用程序中手工編寫的。這些文檔,通常稱為接口規范,描述了字段名、長度、分隔符、層次結構等等。用戶采用他們認為合適的實踐;最接近標准的是熟悉的逗號分隔值(CSV)模式,盡管 CSV 文件變化很大。如果您懷疑這一點,試著將一個 CSV 文件導入電子表格應用程序,並且注意所有可用選項。

事實上,近幾年來為企業、web 或移動市場編程的人都遇到過 XML,幾乎您見到的每個地方都有。

一個 XML 文檔有一個可辨認的結構:一系列可以隨意包含屬性和子元素的元素。每個有效的 XML 文件第一行都有這樣一個聲明:<?XML version="1.0" encoding="utf-8"?>。後面的內容根據應用程序而定。XML 的好處就在於它的自述性。

XML 模式

盡管 XML 文檔是自述的,但也必須遵循一定的規則和指導方針,這就需要 XML 模式,它是一個描述特定 XML 文件結構的文檔。此類結構通常是冗長且復雜的。(值得爭議的是,XML 對 IT 領域最糟糕的貢獻是,當高度描述的數據結構這一理念成為時尚時導致了數據爆炸,且這種情況由於過去十年中磁盤存儲技術成本大幅降低而加劇。)

當這些大且復雜的文件變得更規范時,對程序員和分析員來說手工處理通常是不可能完成的。為了解決這個問題,XML 編輯器和驗證工具可以在文件和相關的任務管理方面給予幫助。例如,文檔和遺留格式轉換。

除了一般的文本數據,XML 過去常用於存儲二進制數據,通過一個稱為 CDATA 的特殊標記集合實現。一個 XML 文檔中的 CDATA 標記可能含有各種數據,包括其他標記文本,假設該文本本身不含有CDATA

通過使用 XML 作為一個結構來執行請求/響應查詢,這並不是 API 使用該功能的常用方式。響應數據經常包含一個包含在 CDATA 標記中的 XML 結構。例如,一個 API 調用可能使用一個姓氏 Mott 來請求一個客戶記錄。數據找到時,封裝到一個 XML 結構中並將其置於響應元素中,如 清單 1 所示:


清單 1. 將數據封裝到 XML 結構中並將其置於響應元素中 
				
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<request>
<query>
<lastname>Mott</lastname>
<maxhits>100</maxhits>
</query>
</request>

<?XML version="1.0" encoding="UTF-8" standalone="yes"?>
<response>
<returncode>200</returncode>
<query>
<lastname>Mott</lastname>
<hits>1</hits>
</query>
<data>
<![CDATA[
<contact>
<firstname>Troy</firstname>
<lastname>Mott</lastname>
<age>not telling</age>
</contact>
]]>
</data>
</response>

工作空間中的 XML

今天,XML 是默認的、預定數據格式。盡管同一數據的其他格式也可用,但基於 XML 結構的可用性進行計劃是一種最安全的方式。

Enterprise Resource Planning (ERP) 包頻繁使用 XML 進行數據到任務的導入和導出。Internet 新聞網站經常將數據提供為 Really Simple Syndication (RSS) — 具有新聞閱讀軟件可以處理的預定義格式的 XML 文檔。甚至文字處理應用程序(例如 OpenOffice.org 和 Microsoft® Office)也使用 XML。

現在的 Microsoft Office 文件是 PKZIP 兼容的,含有多個 XML 文檔。 每個 XML 在第一行都有這個常見聲明。正如您在 清單 2 所看到的,閱讀這些屬性可能有點難:


清單 2. 每個文件第一行的常見聲明
				
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <w:document xmlns:ve="http://schemas.openxmlformats.org/markup-compatibility/2006"
 xmlns:o="urn:schemas-microsoft-com:office:office"
 xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
 xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math"
 xmlns:v="urn:schemas-microsoft-com:vml"
 xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing"
 xmlns:w10="urn:schemas-microsoft-com:office:word"
 xmlns:w="http://schemas.openxmlformats.org/Wordprocessingml/2006/main"
 xmlns:wne="http://schemas.microsoft.com/Office/word/2006/wordml">
 <w:body><w:p w:rsidR="00B6337C" w:rsidRDefault="00663F0E"><w:r>
 <w:t xml:space="preserve">This is a sample </w:t></w:r><w:r
 w:rsidRPr="006906EA"><w:rPr><w:i/></w:rPr><w:t>Microsoft 
 Word document</w:t></w:r><w:r><w:t xml:space="preserve"> used
 to </w:t></w:r><w:r w:rsidRPr="006906EA"><w:rPr><w:b/>
 <w:u w:val="single"/></w:rPr><w:t>demonstrate</w:t></w:r>
 <w:r><w:t xml:space="preserve"> some XML topics.</w:t></w:r>
 </w:p><w:p w:rsidR="00B14B2A" w:rsidRDefault="00B14B2A"/><w:p 
 w:rsidR="00B14B2A"w:rsidRDefault="00B14B2A"><w:r><w:rPr>
 <w:noProof/></w:rPr><w:drawing><wp:inline distT="0" distB="0" 
 distL="0" distR="0"><wp:extent cx="3276600" cy="3838575"/><wp:effectExtent
 l="19050" t="0" r="0" b="0"/><wp:docPr id="1" name="Picture 0"
 descr="frankableson.jpg"/><wp:cNvGraphicFramePr><a:graphicFrameLocks
 xmlns:a="http://schemas.openXMLformats.org/drawingml/2006/main"
 noChangeASPect="1"/></wp:cNvGraphicFramePr><a:graphic
 xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"><a:graphicData
 uri="http://schemas.openxmlformats.org/drawingml/2006/picture"><pic:pic
 xmlns:pic="http://schemas.openXMLformats.org/drawingml/2006/picture">
 <pic:nvPicPr><pic:cNvPrid="0"name="frankableson.jpg"/><pic:cNvPicPr/>
 </pic:nvPicPr><pic:blipFill><a:blip r:embed="rId4"
 cstate="print"/><a:stretch><a:fillRect/></a:stretch>
 </pic:blipFill><pic:spPr><a:xfrm><a:off x="0" y="0"/>
 <a:ext cx="3276600" cy="3838575"/></a:xfrm><a:prstGeom
 prst="rect"><a:avLst/></a:prstGeom></pic:spPr></pic:pic>
 </a:graphicData></a:graphic></wp:inline></w:drawing>
 </w:r></w:p><w:p w:rsidR="00663F0E" w:rsidRDefault="00663F0E"/>
 <w:p w:rsidR="00CC16CE" w:rsidRDefault="00CC16CE"/><w:sectPr 
 w:rsidR="00CC16CE" w:rsidSect="00B6337C"><w:pgSz w:w="12240" w:h="15840"/>
 <w:pgMar w:top="1440" w:right="1440" w:bottom="1440" w:left="1440" w:header="720" 
 w:footer="720" w:gutter="0"/><w:cols w:space="720"/><w:docGrid
 w:linePitch="360"/></w:sectPr></w:body></w:document>

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://<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 對象其構造是一個 : 對,對象元素之間用逗號隔開,每個對象被包含在一對大括號 {} 內。一組對象數組包含在一對方括號中。這是將數據行從一個數據庫發送到一個對象數組的一種常見方法。其中每個數組元素對應數據庫中的一行,每個對象屬性代表數據的一列。

清單 3 顯示了一個在 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 onclick="updatepage();">Search for Mott</button><br />
<span id="target">&nbsp;</span>
</body>
</Html>

注意,這個示例使用 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 http://twitter.com/statuses/user_timeline/userid.format,其中 userid 是您的 Twitter 用戶 ID,format 是您要的格式:XML 或 JSON。

您也可以直接在您的 Twitte 頁面上找到此頁的鏈接,如 圖 1 所示。在那裡可以看到您的 Twitter 用戶 ID。


圖 1. 您 Twitter 頁面上的 feed 頁鏈接
 fableson Twitter 頁以及右下角的鏈接 ‘RSS feed of fableson's tweets’ 的屏幕截圖 

完整的 feed 文件相當冗長,下面兩個清單只顯示 feed 的第一項(來自我的 Twitter 帳戶)。清單 4 包含以下 XML 片段:


清單 4. XML 片段
				
<?XML version="1.0" encoding="UTF-8"?>
<statuses type="array">
<status>
  <created_at>Thu Apr 29 05:25:29 +0000 2010</created_at>
  <id>13052369631</id>
  <text>Wrapping up new article on JSON for android
 programmers...</text>
  <source><a href="http://www.linkedin.com/"rel="nofollow">
   LinkedIn</a></source>
  <truncated>false</truncated>
  <in_reply_to_status_id/>
  <in_reply_to_user_id/>
  <favorited>false</favorited>
  <in_reply_to_screen_name/>
  <user>
    <id>15221439</id>
    <name>fableson</name>
    <screen_name>fableson</screen_name>
    <location>Byram Township, NJ</location>
    <description/>

<profile_image_url>http://a3.twimg.com/profile_images/260492935
/bookcover_normal.jpg</profile_image_url>
    <url>http://msiservices.com</url>
    <protected>false</protected>
    <followers_count>52</followers_count>
    <profile_background_color>9ae4e8
    <profile_text_color>000000</profile_text_color>
    <profile_link_color>0000ff</profile_link_color>
    <profile_sidebar_fill_color>e0ff92
</profile_sidebar_fill_color>
    <profile_sidebar_border_color>87bc44
</profile_sidebar_border_color>
    <friends_count>10</friends_count>
    <created_at>Tue Jun 24 17:04:11 +0000 2008</created_at>
    <favourites_count>0</favourites_count>
    <utc_offset>-18000</utc_offset>
    <time_zone>Eastern Time (US & Canada)</time_zone>

   <profile_background_image_url>http://s.twimg.com/a/1272044617/
images/themes/theme1/bg.png</profile_background_image_url>
   
<profile_background_tile>false</profile_background_tile>
    <notifications>false</notifications>
    <geo_enabled>false</geo_enabled>

    <verified>false</verifIEd>
    <following>false</following>
    <statuses_count>91</statuses_count>
    <lang>en</lang>
    <contributors_enabled>false</contributors_enabled>
  </user>
  <geo/>
  <coordinates/>
  <place/>
  <contributors/>
</status>
</statuses>

清單 5 是同一數據,這次是以 JSON 格式顯示:


清單 5. JSON 格式的 feed 數據
				
[
{"in_reply_to_status_id":null,
"favorited":false,
"created_at":"Thu Apr 29 05:25:29 +0000 2010",
"in_reply_to_screen_name":null,
"geo":null,
"source":"<a href=\"http://www.linkedin.com/\" rel=\"nofollow\
          ">LinkedIn</a>",
"contributors":null,
"place":null,
"truncated":false,
"coordinates":null,
"user":
{
    "friends_count":10,
    "description":"",
    "lang":"en",
    "statuses_count":91,
    "time_zone":"Eastern Time (US & Canada)",
    "profile_link_color":"0000ff",
    "favourites_count":0,
    "created_at":"Tue Jun 24 17:04:11 +0000 2008",
    "contributors_enabled":false,
    "profile_sidebar_fill_color":"e0ff92",
    "following":null,
    "geo_enabled":false,
    "profile_background_image_url":"http://s.twimg.com/a/1272044617/images/themes
/theme1/bg.png",
    "profile_image_url":"http://a3.twimg.com/profile_images/260492935
/bookcover_normal.jpg",
    "notifications":null,
    "profile_sidebar_border_color":"87bc44",
    "url":"http://msiservices.com",
    "verifIEd":false,
    "profile_background_tile":false,
    "screen_name":"fableson",
    "protected":false,
    "location":"Byram Township, NJ",
    "profile_background_color":"9ae4e8",
    "name":"fableson",
    "followers_count":52,
    "id":15221439,
    "utc_offset":-18000,
    "profile_text_color":"000000"
},
"in_reply_to_user_id":null,
"id":13052369631,
"text":"Wrapping up new article on JSON for android programmers..."}
]

注意,在兩個清單中除了狀態更新外還有非常多附加數據。您只需要注意日期/時間,何時發布公告以及公告的內容。接下來,將向您展示解析該數據的 android 應用程序的相關部分。整個項目見 下載部分

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved