Android學(xué)習(xí)筆記45之gson解析json
JSON即JavaScript Object Natation, 是一種輕量級的數(shù)據(jù)交換格式,采用完全獨(dú)立于語言的文本格式,為Web應(yīng)用開發(fā)提供了一種理想的數(shù)據(jù)交換格式。
JSON對象:
JSON中對象(Object)以"{"開始, 以"}"結(jié)束. 對象中的每一個item都是一個key-value對, 表現(xiàn)為"key:value"的形式, key-value對之間使用逗號分隔. 如:{"name":"coolxing", "age"=24, "male":true, "address":{"street":"huiLongGuan", "city":"beijing", "country":"china"}}. JSON對象的key只能是string類型的, 而value可以是string, number, false, true, null, Object對象甚至是array數(shù)組, 也就是說可以存在嵌套的情況.
JSON數(shù)組:
JSON數(shù)組(array)以"["開始, 以"]"結(jié)束, 數(shù)組中的每一個元素可以是string, number, false, true, null, Object對象甚至是array數(shù)組, 數(shù)組間的元素使用逗號分隔. 如["coolxing", 24, {"street":"huiLongGuan", "city":"beijing", "country":"china"}].
在上一篇博文《Android學(xué)習(xí)筆記44:JSON數(shù)據(jù)解析》中,我們使用基本的JSON API完成了在服務(wù)器端創(chuàng)建JSON數(shù)據(jù),以及在Android客戶端對JSON數(shù)據(jù)進(jìn)行解析。
其實,要創(chuàng)建和解析JSON數(shù)據(jù),也可以使用GSON來完成。GSON是Google提供的用來在Java對象和JSON數(shù)據(jù)之間進(jìn)行映射的Java類庫。使用GSON,可以很容易的將一串JSON數(shù)據(jù)轉(zhuǎn)換為一個Java對象,或是將一個Java對象轉(zhuǎn)換為相應(yīng)的JSON數(shù)據(jù)。
1.GSON的兩個重要方法
在GSON的API中,提供了兩個重要的方法:toJson()和fromJson()方法。其中,toJson()方法用來實現(xiàn)將Java對象轉(zhuǎn)換為相應(yīng)的JSON數(shù)據(jù),fromJson()方法則用來實現(xiàn)將JSON數(shù)據(jù)轉(zhuǎn)換為相應(yīng)的Java對象。
1.1 toJson()方法
toJson()方法用于將Java對象轉(zhuǎn)換為相應(yīng)的JSON數(shù)據(jù),主要有以下幾種形式:
(1)String toJson(JsonElement jsonElement);
?。?)String toJson(Object src);
?。?)String toJson(Object src, Type typeOfSrc);
其中,方法(1)用于將JsonElement對象(可以是JsonObject、JsonArray等)轉(zhuǎn)換成JSON數(shù)據(jù);方法(2)用于將指定的Object對象序列化成相應(yīng)的JSON數(shù)據(jù);方法(3)用于將指定的Object對象(可以包括泛型類型)序列化成相應(yīng)的JSON數(shù)據(jù)。
1.2 fromJson()方法
fromJson()方法用于將JSON數(shù)據(jù)轉(zhuǎn)換為相應(yīng)的Java對象,主要有以下幾種形式:
?。?)<T> T fromJson(JsonElement json, Class<T> classOfT);
?。?)<T> T fromJson(JsonElement json, Type typeOfT);
?。?)<T> T fromJson(JsonReader reader, Type typeOfT);
?。?)<T> T fromJson(Reader reader, Class<T> classOfT);
(5)<T> T fromJson(Reader reader, Type typeOfT);
?。?)<T> T fromJson(String json, Class<T> classOfT);
?。?)<T> T fromJson(String json, Type typeOfT);
以上的方法用于將不同形式的JSON數(shù)據(jù)解析成Java對象。
2.在服務(wù)器端生成JSON數(shù)據(jù)
要使用GSON技術(shù)在服務(wù)器端生成JSON數(shù)據(jù),首先需要完成以下兩個準(zhǔn)備工作。
?。?)使用MyEclipse創(chuàng)建了一個Web Project,這里我將該工程命名為了“GsonDemoProject”,用來模擬服務(wù)器端的Web服務(wù)。
?。?)往該工程中導(dǎo)入GSON的API數(shù)據(jù)包gson-2.2.1.jar。
然后,我們便可以在該工程中創(chuàng)建一個JsonTools工具類,并實現(xiàn)靜態(tài)方法createJsonString(),在該方法中通過使用GSON技術(shù)來生成JSON數(shù)據(jù)。該方法的具體實現(xiàn)如下。
public class JsonTools { /* * Function : 生成JSON字符串 * Param : value 想要轉(zhuǎn)換成JSON字符串的Object對象 * Retuen : JSON字符串 * Author : 博客園-依舊淡然 */ public static String createJsonString(Object value) { Gson gson = new Gson(); String string = gson.toJson(value); return string; } }
可以看到,這個方法的具體實現(xiàn)非常簡單,首先創(chuàng)建一個Gson對象,然后通過調(diào)用Gson對象的toJson()方法,將傳進(jìn)來的value(任意的Java對象)轉(zhuǎn)換成JSON字符串即可。
通過使用該方法,我們可以很方便的將任意Java對象傳遞進(jìn)來,并將其轉(zhuǎn)化成JSON數(shù)據(jù)。和上一篇博文中一樣,我們可以在JsonService類中,實現(xiàn)一個簡單的獲取Person對象列表的方法,具體如下:
/* * Function : 獲取Person對象列表 * 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; }
在該方法中,我們向List列表中加入了3個Person對象,每個Person對象具有id(int)、name(String)和age(int)三個屬性。
最后,我們還需要創(chuàng)建一個繼承自HttpServlet的JsonAction類,并實現(xiàn)其中的doPost()方法,用來響應(yīng)客戶端對服務(wù)器的請求。具體如下:
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"); if(action_flag.equals("persons") { str = JsonTools.createJsonString(listPerson); } out.println(str); out.flush(); out.close(); }
在該方法中,我們通過調(diào)用JsonService類中的getListPerson()方法獲得了Person對象列表listPerson,并將其傳入JsonTools.createJsonString()方法中,生成了Person對象列表的JSON數(shù)據(jù)。將該工程發(fā)布到Tomcat上,使用瀏覽器訪問該Web工程,可以看到如圖1所示的界面,Person對象列表被成功的轉(zhuǎn)化成了JSON數(shù)據(jù)。
圖1 生成的JSON數(shù)據(jù)
3.在客戶端解析JSON數(shù)據(jù)
在Android工程中,我們可以通過HttpURLConnection接口訪問圖1所示的URL來獲得服務(wù)器上的JSON數(shù)據(jù)。
得到JSON數(shù)據(jù)之后,便可以通過使用前面提到的fromJson()方法,將圖1 所示的JSON數(shù)據(jù)還原成對應(yīng)的Person對象列表了。當(dāng)然了,因為這里使用到了GSON,同樣需要向Android工程中導(dǎo)入gson-2.2.1.jar包。具體的實現(xiàn)方法如下。
/* * Function : 解析JSON數(shù)據(jù),還原成Person對象列表 * Param : jsonString 從服務(wù)器獲得的Json數(shù)據(jù) * Retuen : Person對象列表 * Author : 博客園-依舊淡然 */ public static List<Person> getListPerson(String jsonString) { List<Person> list = new ArrayList<Person>(); Gson gson = new Gson(); list = gson.fromJson(jsonString, new TypeToken<List<Person>>(){}.getType()); return list; }
可以看到,使用GSON解析JSON數(shù)據(jù)的代碼實現(xiàn)也非常簡單。其中,TypeToken是GSON提供的數(shù)據(jù)類型轉(zhuǎn)換器,支持多種數(shù)據(jù)集合類型轉(zhuǎn)換,其反射機(jī)制可以實現(xiàn)將解析出來的Java對象映射到對應(yīng)的數(shù)據(jù)集合中。
在本實例中,同樣點擊Button按鈕向服務(wù)器發(fā)送獲取JSON數(shù)據(jù)的請求,從服務(wù)器獲得JSON數(shù)據(jù)后,使用以上的代碼完成對JSON數(shù)據(jù)的解析,最后將解析得到的Person對象依次顯示在TextView控件中。程序運(yùn)行的結(jié)果如圖2所示。
圖2 運(yùn)行結(jié)果
以上內(nèi)容是小編給大家分享的Android學(xué)習(xí)筆記45之gson解析json的全部敘述,希望大家喜歡。
相關(guān)文章
Android Studio 新建項目通過git上傳到碼云圖文教程詳解
本文通過圖文并茂的方式給大家介紹了Android Studio 新建項目通過git上傳到碼云的方法,需要的朋友可以參考下2017-11-11Android使用acoco統(tǒng)計代碼行覆蓋率介紹
大家好,本篇文章主要講的是Android使用acoco統(tǒng)計代碼行覆蓋率介紹,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12Flutter?Widget之FutureBuilder使用示例詳解
這篇文章主要為大家介紹了Flutter?Widget之FutureBuilder使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11Eclipse下配置Ant腳本并自動打包帶簽名的Android apk
這篇文章主要介紹了Eclipse下配置Ant腳本并自動打包帶簽名的Android apk的相關(guān)資料,需要的朋友可以參考下2016-03-03Android?ViewPager2?+?Fragment?聯(lián)動效果的實現(xiàn)思路
這篇文章主要介紹了Android?ViewPager2?+?Fragment?聯(lián)動,本篇主要介紹一下 ViewPager2 + Fragment聯(lián)動效果的實現(xiàn)思路,需要的朋友可以參考下2022-12-12android webvie指定視頻播放器播放網(wǎng)站視頻
android webview過濾調(diào)用第三方瀏覽器,并且解析視頻網(wǎng)站播放地址,使用指定播放器2013-11-11Android開發(fā)之使用ViewPager實現(xiàn)圖片左右滑動切換效果
這篇文章主要介紹了Android開發(fā)之使用ViewPager實現(xiàn)圖片左右滑動切換效果的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-08-08Android XML設(shè)置屏幕方向(android:screenOrientation)詳解
這篇文章主要介紹了Android XML設(shè)置屏幕方向(android:screenOrientation)詳解的相關(guān)資料,需要的朋友可以參考下2017-04-04