1. 程式人生 > >第八章 網路的時代—網路開發(4)

第八章 網路的時代—網路開發(4)

8.5輕量級的資料交換格式—JSON

8.5.1 客戶端與伺服器端的資料互動

Android應用開發中,尤其是網路應用的開發,我們經常需要從網路上獲取資料,而不僅僅從本地資料庫或者本地檔案中取得資料,這個時候就涉及到客戶端與伺服器端的資料互動了。客戶端如何需要與伺服器端進行資料互動,就需要約定一種協議或者是資料交換格式。那麼一般的,Android客戶端與伺服器端進行資料互動有哪些方式呢?根據業務需求的不同,可能會選用不用的方式,通常有以下幾種方式。

1)基於SOAPWeb服務(WebService)方式

Web服務是一種面向服務的架構的技術,通過標準的Web協議提供服務,目的是保證不同平臺的應用服務可以互操作。

根據W3C的定義,Web服務應當是一個軟體系統,用以支援網路間不同機器的互動操作。網路服務通常是許多應用程式介面所組成的,它們通過網路,例如國際網際網路的遠端伺服器端,執行客戶所提交服務的請求。

Web服務是基於XMLHTTPS的一種服務,其通訊協議主要基於SOAP,通過WSDL來描述服務,通過UDDI來發現和獲得服務的元資料。

2)自定義XML資料格式的方式

除了使用標準的SOAP協議以外,專案組還可以自定義XML資料格式用來傳遞資料。比如專案可以約定如下XML格式,用來傳遞使用者的資料資訊。

<request>

<type>1</type>

<id>100000</id>

<name>jname</name>

<state>1</state>

……

</request>

3JSON資料格式

JSONJavascriptObjectNotation)是一種輕量級的資料交換語言,以文字為基礎,且易於讓人閱讀。儘管JSON是在Javascript的一個子集,但JSON是獨立於語言的文字格式,可以使用於任何語言。

JSON用於描述資料結構,有以下形式存在。

物件(object):一個物件以“{”開始,並以“}”結束。一個物件包含一系列非排序的名稱/值對,每個名稱/值對之間使用“,”分割。

名稱/值對(collection):名稱和值之間使用“:”隔開,一般的形式是:

{name:value}

一個名稱是一個字串;一個值可以是一個字串,一個數值,一個物件,一個布林值,一個有序列表,或者一個null值。

值的有序列表(Array):一個或者多個值用“,”分割後,使用“[”,“]”括起來就形成了這樣的列表,形如:

[collection,collection]

字串:以""括起來的一串字元。

數值:一系列0-9的數字組合,可以為負數或者小數。還可以用“e”或者“E”表示為指數形式。

布林值:表示為true 或者false

下面的例子就能夠清晰的說明JSON格式的結構。

{

"firstName":"John",

"lastName":"Smith",

"male":true,

"age":25,

"address":

{

"streetAddress":"21 2nd Street",

"city":"New York",

"state":"NY",

"postalCode":"10021"

},

"phoneNumber":

[

{

"type":"home",

"number":"212 555-1234"

},

{

"type":"fax",

"number":"646 555-4567"

}

]

}

8.5.2 XML格式與JSON格式的比較

無論是Web服務的方式,還是自定義XML的方式,都是以XML格式為基礎的。如今JSON資料格式已經在網路開發中越來越流行了,在很多場合都可以取代XML格式。這主要是因為JSON更適合網路資料的傳輸。那麼,具體的,JSON資料格式與XML資料格式相比較,都有哪些優缺點呢。

使用XML作為傳輸格式的優勢:

1)格式統一,符合標準。

2)容易與其他系統進行遠端互動,資料共享比較方便。

使用XML格式的缺點:

1XML檔案格式檔案龐大,格式複雜,傳輸佔用頻寬。

2)伺服器端和客戶端都需要花費大量程式碼來解析XML,不論伺服器端和客戶端程式碼變的異常複雜和不容易維護。

3)客戶端不同瀏覽器之間解析XML的方式不一致,需要重複編寫很多程式碼。

4)伺服器端和客戶端解析XML花費資源和時間。

使用JSON格式的優點:

1)資料格式比較簡單,易於讀寫,格式都是壓縮的,佔用頻寬小。

2)易於解析這種語言,客戶端JavaScript可以簡單的通過eval()進行JSON資料的讀取。

3)支援多種語言,包括ActionScriptCC#ColdFusionJavaJavaScriptPerlPHPPythonRuby等語言伺服器端語言,便於伺服器端的解析。

4)在PHP世界,已經有PHP-JSONJSON-PHP出現了,便於PHP序列化後的程式直接呼叫。PHP伺服器端的物件、陣列等能夠直接生JSON格式,便於客戶端的訪問提取。

5)因為JSON格式能夠直接為伺服器端程式碼使用,大大簡化了伺服器端和客戶端的程式碼開發量,但是完成的任務不變,且易於維護。

使用JSON格式的缺點:

1)沒有XML格式這麼推廣的深入人心和使用廣泛,沒有XML那麼通用性。

2JSON格式目前在WebService中推廣還屬於初級階段。

通過上面的對比我們可以看出,JSON是一種輕量級的資料交換格式,具有良好的可讀和便於快速編寫的特性,可以在不同平臺間進行資料交換。為了節省記憶體,提高響應速度,在Android網路應用的開發中比較適合使用JSON格式。

8.5.3 解析JSON格式資料

AndroidSDK有一個包直接支援JSON格式的資料解析,都在org.json下,主要有以下幾個類:

1JSONObject

可以看作是一個JSON物件。這是系統中有關JSON定義的基本單元,其包含一對兒(Key/Value)數值。

2JSONStringer

JSON文字構建類,根據官方的解釋,這個類可以幫助快速和便捷的建立JSONtext。其最大的優點在於可以減少由於格式的錯誤導致程式異常,引用這個類可以自動嚴格按照JSON語法規則(syntaxrules)建立JSONtext。每個JSONStringer實體只能對應建立一個JSONtext

3JSONArray

它代表一組有序的數值。將其轉換為String輸出所表現的形式是用方括號包裹,數值以逗號”,”分隔(例如:[value1,value2,value3],大家可以親自利用簡短的程式碼更加直觀的瞭解其格式)。

4JSONTokener

JSON解析類。

5JSONException

JSON解析過程中可能發生的異常。

下面我們就通過程式碼來說明如何在Android中對JSON資料進行解析。

假設我們已經可以從伺服器端獲取資料了,而且返回的JSON資料如下:

{"FLAG":"flag",

"jobject":[

{"id":"100000","name":"jname","state":1},

{"id":"200000","name":"jname","state":2}]}

下面的程式碼片段舉例說明如何解析出FLAG物件和jobject物件。

/**

*JSON格式資料進行解析

*/

publicvoid readJSON(String str){

try{

//轉換為JSONObject

JSONObjectresult = new JSONObject(str);

Log.d("readJSON","FLAG = " + result.getString("FLAG"));

//獲取JSONArray陣列

JSONArrayjsonArray = result.getJSONArray("jobject");

Log.d("readJSON","Numberof entries " + jsonArray.length());

for(int i = 0; i < jsonArray.length(); i++) {

JSONObjectjsonObject = jsonArray.getJSONObject(i);

Log.d("readJSON","id= " + jsonObject.getString("id"));

Log.di("readJSON","name= " + jsonObject.getString("name"));

Log.d("readJSON","state= " + jsonObject.getString("state"));

}

}catch (Exception e) {

e.printStackTrace();

}

}

下面的程式碼片段說明了如何簡單的構造一個JSON串。

/**

*構造一個JSON格式的資料

*/

publicString writeJSON() {

JSONObjectobject = new JSONObject();

try{

object.put("id","100000");

object.put("name","jname");

object.put("state",new Integer(1));

}catch (JSONException e) {

e.printStackTrace();

}

Log.d("writeJSON",object.toString());

returnobject.toString();

}

構造好的JSON串可以通過POST方式傳送給伺服器端,伺服器端再進行解析,執行後續的業務流程。

8-4展示了上面的示例程式碼的執行結果。

8-4JSON讀寫結果圖

通過上面的例子可以看出,在Android開發中,使用JSON格式的資料與伺服器端互動還是非常方便的。

經驗分享:

無論是採用JSON格式,還是自定義XML格式,客戶端與伺服器端傳輸的資料都是明文的,這樣並不安全。所以,如果專案對資料安全性有一定的要求,務必要考慮做下加密解密的工作。

另外,由於AndroidAPK包很容易被反編譯,如果單純的使用Java來實現加密解密的程式碼,就很容易洩露具體演算法。所以,如果專案中涉及到加密解密的操作,可以考慮使用JNI方式去做,這樣被破解的可能性就小很多了。