Android JSON數據解析(GSON方式)

1.GSON的兩個重要方法

  在GSON的API中,提供了兩個重要的方法:toJson()和fromJson()方法。其中,toJson()方法用來實現將Java對象轉換爲相應的JSON數據,fromJson()方法則用來實現將JSON數據轉換爲相應的Java對象。

1.1 toJson()方法

  toJson()方法用於將Java對象轉換爲相應的JSON數據,主要有以下幾種形式:

  (1)String toJson(JsonElement jsonElement);

  (2)String toJson(Object src);

  (3)String toJson(Object src, Type typeOfSrc);

  其中,方法(1)用於將JsonElement對象(可以是JsonObject、JsonArray等)轉換成JSON數據;方法(2)用於將指定的Object對象序列化成相應的JSON數據;方法(3)用於將指定的Object對象(可以包括泛型類型)序列化成相應的JSON數據。

1.2 fromJson()方法

  fromJson()方法用於將JSON數據轉換爲相應的Java對象,主要有以下幾種形式:

  (1)<T> T fromJson(JsonElement json, Class<T> classOfT);

  (2)<T> T fromJson(JsonElement json, Type typeOfT);

  (3)<T> T fromJson(JsonReader reader, Type typeOfT);

  (4)<T> T fromJson(Reader reader, Class<T> classOfT);

  (5)<T> T fromJson(Reader reader, Type typeOfT);

  (6)<T> T fromJson(String json, Class<T> classOfT);

  (7)<T> T fromJson(String json, Type typeOfT);

  以上的方法用於將不同形式的JSON數據解析成Java對象。

 

2.在服務器端生成JSON數據

  要使用GSON技術在服務器端生成JSON數據,首先需要完成以下兩個準備工作。

  (1)使用MyEclipse創建了一個Web Project,這裏我將該工程命名爲了“GsonDemoProject”,用來模擬服務器端的Web服務。 

  (2)往該工程中導入GSON的API數據包gson-2.2.1.jar。 

  然後,我們便可以在該工程中創建一個JsonTools工具類,並實現靜態方法createJsonString(),在該方法中通過使用GSON技術來生成JSON數據。該方法的具體實現如下。

複製代碼
 1   public class JsonTools {
 2       
 3       /*
 4        * Function :   生成JSON字符串
 5        * Param   :   value     想要轉換成JSON字符串的Object對象
 6        * Retuen  :   JSON字符串
 7        * Author  :   博客園-依舊淡然
 8        */
 9       public static String createJsonString(Object value) {
10           Gson gson = new Gson();
11           String string = gson.toJson(value);
12           return string;
13       }
14       
15   }
複製代碼

  可以看到,這個方法的具體實現非常簡單,首先創建一個Gson對象,然後通過調用Gson對象的toJson()方法,將傳進來的value(任意的Java對象)轉換成JSON字符串即可。

  通過使用該方法,我們可以很方便的將任意Java對象傳遞進來,並將其轉化成JSON數據。和上一篇博文中一樣,我們可以在JsonService類中,實現一個簡單的獲取Person對象列表的方法,具體如下:

複製代碼
 1     /*
 2      * Function :  獲取Person對象列表
 3      * Author  :  博客園-依舊淡然
 4      */
 5     public List<Person> getListPerson() {
 6         List<Person> list = new ArrayList<Person>();
 7         Person person1 = new Person(001, "jack", 25);
 8         Person person2 = new Person(002, "rose", 24);
 9         Person person3 = new Person(003, "bob", 26);
10         list.add(person1);
11         list.add(person2);
12         list.add(person3);
13         return list;
14     }
複製代碼

  在該方法中,我們向List列表中加入了3個Person對象,每個Person對象具有id(int)、name(String)和age(int)三個屬性。

  最後,我們還需要創建一個繼承自HttpServlet的JsonAction類,並實現其中的doPost()方法,用來響應客戶端對服務器的請求。具體如下:

複製代碼
 1   public void doPost(HttpServletRequest request, HttpServletResponse response)
 2             throws ServletException, IOException {
 3 
 4         response.setContentType("text/html;charset=utf-8");
 5         request.setCharacterEncoding("utf-8");
 6         response.setCharacterEncoding("utf-8");
 7         PrintWriter out = response.getWriter();
 9         List<Person> listPerson = jsonService.getListPerson();
11         String str = null;
12         String action_flag = request.getParameter("action_flag");
13         if(action_flag.equals("persons") {
14             str = JsonTools.createJsonString(listPerson);
15         }
16         out.println(str);
17         out.flush();
18         out.close();
19     }
複製代碼

  在該方法中,我們通過調用JsonService類中的getListPerson()方法獲得了Person對象列表listPerson,並將其傳入JsonTools.createJsonString()方法中,生成了Person對象列表的JSON數據。將該工程發佈到Tomcat上,使用瀏覽器訪問該Web工程,可以看到如圖1所示的界面,Person對象列表被成功的轉化成了JSON數據。

圖1 生成的JSON數據

 

3.在客戶端解析JSON數據

  在Android工程中,我們可以通過HttpURLConnection接口訪問圖1所示的URL來獲得服務器上的JSON數據。

  得到JSON數據之後,便可以通過使用前面提到的fromJson()方法,將圖1 所示的JSON數據還原成對應的Person對象列表了。當然了,因爲這裏使用到了GSON,同樣需要向Android工程中導入gson-2.2.1.jar包。具體的實現方法如下。

複製代碼
 1     /*
 2      * Function  :   解析JSON數據,還原成Person對象列表
 3      * Param     :   jsonString         從服務器獲得的Json數據
 4      * Retuen   :   Person對象列表
 5      * Author    :   博客園-依舊淡然
 6      */
 7     public static List<Person> getListPerson(String jsonString) {
 8         List<Person> list = new ArrayList<Person>();
 9         Gson gson = new Gson();
10         list = gson.fromJson(jsonString, new TypeToken<List<Person>>(){}.getType());
11         return list;
12     }
複製代碼

  可以看到,使用GSON解析JSON數據的代碼實現也非常簡單。其中,TypeToken是GSON提供的數據類型轉換器,支持多種數據集合類型轉換,其反射機制可以實現將解析出來的Java對象映射到對應的數據集合中。

  在本實例中,同樣點擊Button按鈕向服務器發送獲取JSON數據的請求,從服務器獲得JSON數據後,使用以上的代碼完成對JSON數據的解析,最後將解析得到的Person對象依次顯示在TextView控件中。程序運行的結果如圖2所示。

圖2 運行結果

作者:依舊淡然
本文版權歸作者所有,未經作者同意,嚴禁轉載及用作商業傳播,否則將追究法律責任。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章