Android高效入門-解析JSON資料,使用json.org、Gson、Jackson教學

作者 | 2016-05-26

在Android中解析從網路取得的JSON資料是很常見的應用,簡單的資料可使用內建的json.org類別,複雜或大量資料時,可使用Google的Gson類別庫或是FastXML的Jackson類別庫。

提醒

本篇文章是延續 Android高效入門-讀取JSON資料與okHttp 一文,可參考該篇內容,熟練後再進行本篇的練習。亦可以直接由GitHub取得上一篇實作完成的專案程式碼,卸離版本控制後再實作本篇。

上個階段完成的程式碼為
檔案庫(Repository): https://github.com/android66/Atm.git
版本名稱: 交易明細-OkHttp連線

解析JSON陣列

一般來說收到JSON資料後,都需轉成語言能夠處理的形式,在Java語言中使用類別與其屬性是最常用的方式,將資料轉換成一個個的物件後,再使用集合類別(List、Set或Map)存放這些物件,因此先從設計一筆資料的類別開始。

設計交易類別Transaction

使用功能表中的「New/Java Class」建立Java類別,名稱為「Transaction」,代表交易,如下圖:

A5108

1. 設計屬性

在Transaction類別的第一層設計帳號、日期、金額與型態四個屬性,如下:

2. 設計建構子

為Transaction設計一個無參數的建構子(建構方法),如下:

再建立一個帶有四個參數的建構子,請使用快速鍵「Alt+Insert」再選擇「Constructor」建構子,按住Shift鍵選擇四個屬性名稱後按下OK,如下圖:

A5110

3. getter/setter方法

一個合法的JavaBean類別需要為屬性設計setter與getter方法,請使用快速鍵「Alt+Insert」再選擇「Getter and Setter」,同樣按著Shift選擇所有屬性,如下圖:

A5109

按下OK後即在Transaction類別中產生必要的setter/getter方法。

使用JSON.org解析

Android中已內建了由http://json.org所設計的JSON轉換工具類別,如JSONObject類別可解析JSON物件,而JSONArray類別可用在JSON陣列。接下來將在自行設計的parseJSON方法中,實作解析JSON資料並將資料收集在Java的ArrayList類別中。以下範例需要的import語法:

本例主要基於回傳的字串,以JSONArray建立物件array,再使用迴圈一個個取出陣列中的JSON物件(使用JSONObject類別),再利用JSONObject提供的方法取出每一筆交內的四項資料,依這四項資料產生Java的Transaction物件,再將物件加入到ArrayList集合物件trans中,如下:

第2行,先準備ArrayList集合物件trans,裏面只能存放Transaction物件。

第4行,將傳入的字串s交給JSONArray的建構子,產生array物件。

第5-14行,以迴圈依序取出交易記錄

第6行,以索引值取得JSONObject物件obj

第7-10行,呼叫JSONObject類的getXX方法取得各個屬性值。

第12行,產生Transaction物件,代表一筆交易記錄

第13行,將物件加入到集合中

執行後在LogCat中的除錯訊息,每一筆交易資料都讀取到,並存放在trans集合中,如下:

使用Gson第三方函式庫

除了Android內建的JSON.org函式庫外,仍有許多在處理JSON格式資料時更有效率的函式庫,例如Gson,Gson是由Google所提供處理JSON格式的函式庫,但並未內建在Android中,以下是Gson的官方網站:

https://github.com/google/gson

請打開專案中的「build.gradle(Module:app)」,在最下方的dependencies區塊中加入Gson的函式庫名稱與版本,如下:

完成後請按上方功能圖示的「Sync Project with Gradle Files」取得並更新函式庫。以下程式碼需要import語法:

請在TransActivity中自行設計一個新的方法「parseGson」,傳入一個字串s,後續執行前再更換之前的parseJSON為本方法,再進行測試。

實作如下的程式碼:

第2行,產生Gson物件

第3-6行,呼叫Gson類別的「fromJson」方法,代表要從JSON格式資料轉換為Java資料

第4行,第一個參數是JSON字串

第5行,第二個參數則是提供給Gson類別我們想要轉出的資料格式,資料型態使用Gson的TypeToken類別宣告目的型態為ArrayList<Transaction>,Gson類別會試著將JSON資料一次就轉換為Java的集合類別,最後以list物件儲存。

第6行,筆者只有印出陣列內元素的筆數與第一筆資料的交易金額,這樣應該就足夠確認轉換是否成功。

執行前請將先前在onCreate方法中的OkHttp回報方法onResponse中的parseJSON該行註解,改用parseGson方法處理,結果如下:

解析後得到的集合list,其中有5個元素,且第一筆資料的金額1500也正確無誤。

使用Jackson第三方函式庫

「FasterXML Jackson」(簡稱Jackson)是目前開放源碼專案中有著高效率特色的函式庫之一,常使用在許多應用程式中,它的官方網站為:

https://github.com/FasterXML/jackson

解析JSON資料時,需要導入兩項Jackson函式庫,請打開專案中的「build.gradle(Module:app)」,在最下方的dependencies區塊中加入Jackson的函式庫名稱與版本,如下:

除此之外,導入Jackson函式庫時因為它將功能拆解成兩個函式庫,而這兩個都有一些版權宣告的文字檔案,這樣會造成最後編譯時的檔案衝突的錯誤而無法編譯,請在同一個build.gradle中的「android」區塊內,再加入排除這些檔案的packagingOptions區塊與其內部的exclude語法,如下:

完成後請按上方功能圖示的「Sync Project with Gradle Files」取得並更新函式庫。以下程式碼需要import語法:

使用Jackson解析JSON資料的程式碼與Gson類似,但其中使用的類別不同,請在TransActivity中自行設計一個新的方法「parseJackson」,傳入一個字串s,後續執行前再更換之前的parseGson為本方法,再進行測試。

實作如下的程式碼:

第2行,產生Jackson函式庫負責解析的ObjectMapper類別

第5行,呼叫ObjectMapper的readValue方法進行JSON格式轉換為Java資料的工作,第一個參數為JSON字串s。

第6行,使用Jackson的TypeReference宣告目的型態為ArrayList<Transaction>,ObjectMapper會試著將JSON資料一次就轉換為Java的集合類別,最後以list物件儲存。

第7行,除錯訊息

執行前請將先前在onCreate方法中的OkHttp回報方法onResponse中的parseGson該行註解,改用parseJackson方法處理,結果如下:

以上三種解析JSON陣列的方式,都能夠正確得到內有所有交易資料的Java集合ArrayList,只有效能與程式可讀性的差異。簡單的資料,可使用內建的JSON.org處理,較繁雜而且資料量大時,應考慮使用Gson或Jackson處理,以提高應用程式的處理效率與程式碼的可讀性,減少使用者等待資料轉換的時間。

 

相關文章:

Category: Android 標籤:, , , , ,

關於 Hank Tom

專長為程式語言、雲端服務開發,Linux系統管理, 任職:利拓科技 技術長,海林行動科技 技術總監 輔仁大學 兼任助理教授 ,為 Android高效入門>深度學習、CentOS 7建置、管理與伺服器架設實戰、Java網路程式設計、雲端網頁程式設計-Google App Engine應用實作 等書作者

使用Facebook直接回應

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *