Android隨手筆記44之JSON數(shù)據(jù)解析
JSON(JavaScript Object Notation)是一種輕量級(jí)的數(shù)據(jù)交換格式,采用完全獨(dú)立于語(yǔ)言的文本格式,為Web應(yīng)用開(kāi)發(fā)提供了一種理想的數(shù)據(jù)交換格式。
本文將主要介紹在Android開(kāi)發(fā)中,如何在服務(wù)器端創(chuàng)建JSON數(shù)據(jù),以及如何在Android客戶端對(duì)JSON數(shù)據(jù)進(jìn)行解析。
1.JSON數(shù)據(jù)結(jié)構(gòu)
在JSON中有兩種數(shù)據(jù)結(jié)構(gòu):對(duì)象和數(shù)組。
1.1對(duì)象
在JSON中,一個(gè)對(duì)象以“{”(左括號(hào))開(kāi)始,“}”(右括號(hào))結(jié)束。每個(gè)“名稱”后跟一個(gè)“:”(冒號(hào)),冒號(hào)后是該名稱的值,多個(gè)“名稱:值”之間使用 “,”(逗號(hào))分隔開(kāi)來(lái)。名稱需要使用雙引號(hào)括起來(lái),值如果是字符串則必須用雙引號(hào)括起來(lái),如果是數(shù)值型則不需要。其結(jié)構(gòu)示意圖如圖1所示。
圖1 JSON對(duì)象結(jié)構(gòu)示意圖
如下的代碼是一個(gè)簡(jiǎn)單的JSON對(duì)象示例:
{ "id":, "name":"jack", "age": }
1.2數(shù)組
在JSON中,數(shù)組是值(value)的有序集合。一個(gè)數(shù)組以“[”(左中括號(hào))開(kāi)始,“]”(右中括號(hào))結(jié)束。值之間使用 “,”(逗號(hào))分隔開(kāi)來(lái)。其結(jié)構(gòu)示意圖如圖2所示。
圖2 JSON數(shù)組結(jié)構(gòu)示意圖
如下的代碼是一個(gè)簡(jiǎn)單的JSON數(shù)組示例:
["北京","上海","廣州"]
1.3值的類型
在JSON的對(duì)象和數(shù)組結(jié)構(gòu)中,value值不僅可以是數(shù)字、字符串等簡(jiǎn)單數(shù)據(jù)類型,還可以是對(duì)象、數(shù)組等,如圖3所示。
圖3 JSON中值的類型
因此,我們可以使用對(duì)象和數(shù)組的組合構(gòu)成復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。如下的代碼使用對(duì)象結(jié)構(gòu)定義了一個(gè)“students”對(duì)象,在“students”對(duì)象中包含了一個(gè)學(xué)生數(shù)組,而學(xué)生數(shù)組中的值又是JSON對(duì)象。
{ "students": [ {"name":"jack","age":}, {"name":"rose","age":} ] }
2.在服務(wù)器端生成JSON數(shù)據(jù)
通常,客戶端在請(qǐng)求服務(wù)器數(shù)據(jù)時(shí),服務(wù)器可以使用XML文檔、JSON數(shù)據(jù)或HTML的形式將數(shù)據(jù)發(fā)送給客戶端。
那么如何在服務(wù)器端生成JSON數(shù)據(jù)呢?首先需要完成以下兩個(gè)準(zhǔn)備工作。
?。?)我們需要使用MyEclipse創(chuàng)建了一個(gè)Web Project,這里我將該工程命名為了“JsonDemoProject”,用來(lái)模擬服務(wù)器端的Web服務(wù)。
?。?)我們還需要在該工程中導(dǎo)入JSON的API數(shù)據(jù)包json-lib-2.2.2-jdk15.jar。
在JSON的API中,提供了JSONObject類,通過(guò)調(diào)用JSONObject類的put(Object key, Object value)方法,可以將一個(gè)Object對(duì)象以鍵值對(duì)的形式存入JSONObject對(duì)象。通過(guò)調(diào)用JSONObject類的toString()方法,則可以將JSONObject對(duì)象轉(zhuǎn)化為JSON數(shù)據(jù)。
如下的代碼創(chuàng)建了一個(gè)JsonTools類,并實(shí)現(xiàn)了靜態(tài)方法createJsonString(),用來(lái)生成JSON數(shù)據(jù)。
public class JsonTools { /* * Function : 生成JSON數(shù)據(jù) * Param : key Json數(shù)據(jù)的鍵值 * object 要生成Json數(shù)據(jù)的內(nèi)容 * Retuen : JSON數(shù)據(jù) * Author : 博客園-依舊淡然 */ public static String createJsonString(String key, Object value) { JSONObject jsonObject = new JSONObject(); //創(chuàng)建一個(gè)JSONObject對(duì)象 jsonObject.put(key, value); //往JSONObject對(duì)象中填入內(nèi)容 return jsonObject.toString(); //生成JSON數(shù)據(jù)并返回 } }
通過(guò)使用該方法,我們可以很方便的將各種數(shù)據(jù)傳遞進(jìn)來(lái),并將其轉(zhuǎn)化成JSON數(shù)據(jù)。比如,我們可以在JsonService類中,實(shí)現(xiàn)一個(gè)簡(jiǎn)單的獲取Person對(duì)象列表的方法,具體如下:
/* * Function : 獲取Person對(duì)象列表 * Author : 博客園-依舊淡然 */ public List<Person> getListPerson() { List<Person> list = new ArrayList<Person>(); Person person = new Person(, "jack", ); Person person = new Person(, "rose", ); Person person = new Person(, "bob", ); list.add(person); list.add(person); list.add(person); return list; }
其中,Person對(duì)象具有id(int)、name(String)和age(int)三個(gè)屬性。
最后,我們可以創(chuàng)建一個(gè)繼承自HttpServlet的JsonAction類,并實(shí)現(xiàn)其中的doPost()方法,用來(lái)響應(yīng)客戶端對(duì)服務(wù)器的請(qǐng)求。具體如下:
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-"); request.setCharacterEncoding("utf-"); response.setCharacterEncoding("utf-"); PrintWriter out = response.getWriter(); List<Person> listPerson = jsonService.getListPerson(); String str = null; String action_flag = request.getParameter("action_flag"); //獲取URL參數(shù) if(action_flag.equals("persons")) { str = JsonTools.createJsonString("persons", listPerson); } out.println(str); out.flush(); out.close(); }
可以看到,在doPost()方法中,我們通過(guò)調(diào)用getListPerson()方法獲得了Person對(duì)象列表listPerson,并將其傳入JsonTools.createJsonString()方法中,從而獲得了一串JSON數(shù)據(jù)。
將該工程發(fā)布到Tomcat上,使用瀏覽器訪問(wèn)該Web工程,可以看到如圖4所示的界面,Person對(duì)象列表被成功的轉(zhuǎn)化成了JSON數(shù)據(jù)。
圖4 生成的JSON數(shù)據(jù)
3.在客戶端解析JSON數(shù)據(jù)
通過(guò)上面的步驟,我們已經(jīng)在服務(wù)器上生成了JSON數(shù)據(jù)。要在我們的Android工程中獲取該JSON數(shù)據(jù)是很容易的,只需要利用Android為我們提供的HttpURLConnection接口訪問(wèn)圖4所示的URL即可。
那么,獲取到服務(wù)器上的JSON數(shù)據(jù)以后,如何在Android工程中完成對(duì)該JSON數(shù)據(jù)的解析呢?
觀察圖4所示的JSON數(shù)據(jù)可以看出:
(1)該JSON數(shù)據(jù)的最外層是JSONObject,JSONObject的鍵是“persons”,值是一個(gè)JSONArray。
?。?)在JSONArray中又包含了3個(gè)JSONObject對(duì)象。
?。?)而在內(nèi)嵌的每一個(gè)JSONObject對(duì)象中,都有3個(gè)鍵值對(duì)的組合。
分析清楚了JSON數(shù)據(jù)的構(gòu)成形式之后,就可以開(kāi)始著手對(duì)其進(jìn)行解析了。在Android工程中,我們可以創(chuàng)建一個(gè)JsonTools類,并實(shí)現(xiàn)getListPerson()類方法,用來(lái)完成把從服務(wù)器獲得的Json數(shù)據(jù)解析出來(lái),還原成Person對(duì)象列表。具體
代碼如下所示:
/* * Function : 解析JSON數(shù)據(jù),還原成Person對(duì)象列表 * Param : key Json數(shù)據(jù)的鍵值 * jsonString 從服務(wù)器獲得的Json數(shù)據(jù) * Retuen : Person對(duì)象列表 * Author : 博客園-依舊淡然 */ public static List<Person> getListPerson(String key, String jsonString) { List<Person> list = new ArrayList<Person>(); try { JSONObject jsonObject = new JSONObject(jsonString); //創(chuàng)建JSONObject對(duì)象 JSONArray personArray = jsonObject.getJSONArray(key); //獲取JSONObject對(duì)象的值,該值是一個(gè)JSON數(shù)組 for(int i = ; i < personArray.length(); i++) { JSONObject personObject = personArray.getJSONObject(i); //獲得JSON數(shù)組中的每一個(gè)JSONObject對(duì)象 Person person = new Person(); int id = personObject.getInt("id"); //獲得每一個(gè)JSONObject對(duì)象中的鍵所對(duì)應(yīng)的值 String name = personObject.getString("name"); int age = personObject.getInt("age"); person.setId(id); //將解析出來(lái)的屬性值存入Person對(duì)象 person.setName(name); person.setAge(age); list.add(person); //將解析出來(lái)的每一個(gè)Person對(duì)象添加到List中 } } catch (JSONException e) { e.printStackTrace(); } return list; }
在本實(shí)例中,點(diǎn)擊Button按鈕向服務(wù)器發(fā)送獲取JSON數(shù)據(jù)的請(qǐng)求,從服務(wù)器獲得JSON數(shù)據(jù)后,可以使用以上的代碼完成對(duì)JSON數(shù)據(jù)的解析,最后將解析得到的Person對(duì)象依次顯示在TextView控件中。程序運(yùn)行的結(jié)果如圖5所示。
圖5 運(yùn)行結(jié)果
以上內(nèi)容是小編給大家分享的Android隨手筆記44之JSON數(shù)據(jù)解析的全部敘述,希望大家喜歡。
- Android編程簡(jiǎn)單解析JSON格式數(shù)據(jù)的方法示例
- Android使用OKHTTP解析JSON數(shù)據(jù)的實(shí)例代碼
- android JSON解析數(shù)據(jù) android解析天氣預(yù)報(bào)
- Android 中對(duì)JSON數(shù)據(jù)解析實(shí)例代碼
- Android解析json數(shù)據(jù)示例代碼(三種方式)
- Android編程實(shí)現(xiàn)根據(jù)經(jīng)緯度查詢地址并對(duì)獲取的json數(shù)據(jù)進(jìn)行解析的方法
- Android之解析JSON數(shù)據(jù)示例(android原生態(tài),F(xiàn)astJson,Gson)
- Android json數(shù)據(jù)解析詳解及實(shí)例代碼
- Android系列---JSON數(shù)據(jù)解析的實(shí)例
- Android利用Gson解析嵌套多層的Json的簡(jiǎn)單方法
- Android M(6.x)使用OkHttp包解析和發(fā)送JSON請(qǐng)求的教程
- Android解析JSON數(shù)據(jù)的方法分析
- Android json解析及簡(jiǎn)單例子
- android解析JSON數(shù)據(jù)
- Android中g(shù)son、jsonobject解析JSON的方法詳解
- Android解析json數(shù)組對(duì)象的方法及Apply和數(shù)組的三個(gè)技巧
- Android學(xué)習(xí)筆記45之gson解析json
- android原生JSON解析實(shí)例
相關(guān)文章
Android中點(diǎn)擊按鈕啟動(dòng)另一個(gè)Activity及Activity之間傳值問(wèn)題
這篇文章主要介紹了Android中點(diǎn)擊按鈕啟動(dòng)另一個(gè)Activity及Activity之間傳值問(wèn)題,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-01-01Android 逆向?qū)W習(xí)詳解及實(shí)例
本文主要介紹Android 逆向?qū)W習(xí),這里整理逆向?qū)W習(xí)的思路及學(xué)習(xí)要點(diǎn),并附示例代碼,幫助大家學(xué)習(xí)理解,有需要的小伙伴可以參考下2016-09-09Android判斷某個(gè)權(quán)限是否開(kāi)啟的方法
今天小編就為大家分享一篇Android判斷某個(gè)權(quán)限是否開(kāi)啟的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07Android根據(jù)包名停止其他應(yīng)用程序的方法
這篇文章主要介紹了Android根據(jù)包名停止其他應(yīng)用程序,需要的朋友可以參考下2020-03-03Android?使用flow實(shí)現(xiàn)倒計(jì)時(shí)的方式
這篇文章主要介紹了Android?使用flow實(shí)現(xiàn)倒計(jì)時(shí)的方式,借助Flow這個(gè)工具,更加優(yōu)雅地實(shí)現(xiàn)這個(gè)需求功能,文末給大家整理了Android?實(shí)現(xiàn)倒計(jì)時(shí)的幾種方式,需要的朋友可以參考下2022-04-04AndroidX下使用Activity和Fragment的變化詳解
這篇文章主要介紹了AndroidX下使用Activity和Fragment的變化詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04解決Android studio中關(guān)于模擬器的/data目錄不能顯示的問(wèn)題
這篇文章主要介紹了解決Android studio中關(guān)于模擬器的/data目錄不能顯示的問(wèn)題,主要原因還是我們權(quán)限不夠,當(dāng)前的用戶沒(méi)有權(quán)限訪問(wèn)data目錄。具體解決方法大家跟隨腳本之家小編一起看看吧2018-06-06Android自定義View實(shí)現(xiàn)跟隨手指移動(dòng)的小兔子
這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)跟隨手指移動(dòng)的小兔子,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-11-11Android手動(dòng)檢查并申請(qǐng)權(quán)限方法
今天小編就為大家分享一篇Android手動(dòng)檢查并申請(qǐng)權(quán)限方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07