Android學習筆記44:JSON資料解析

來源:互聯網
上載者:User

  JSON(JavaScript Object Notation)是一種輕量級的資料交換格式,採用完全獨立於語言的文字格式設定,為Web應用開發提供了一種理想的資料交換格式。

  本文將主要介紹在Android開發中,如何在伺服器端建立JSON資料,以及如何在Android用戶端對JSON資料進行解析。

 

1.JSON資料結構

  在JSON中有兩種資料結構:對象和數組。

1.1對象

  在JSON中,一個對象以“{”(左括弧)開始,“}”(右括弧)結束。每個“名稱”後跟一個“:”(冒號),冒號後是該名稱的值,多個“名稱:值”之間使用 “,”(逗號)分隔開來。名稱需要使用雙引號括起來,值如果是字串則必須用雙引號括起來,如果是數值型則不需要。其結構1所示。

圖1 JSON對象結構

  如下的代碼是一個簡單的JSON對象樣本:

1   {2   "id":001,3   "name":"jack",4   "age":255   }

1.2數組

  在JSON中,數組是值(value)的有序集合。一個數組以“[”(左中括弧)開始,“]”(右中括弧)結束。值之間使用 “,”(逗號)分隔開來。其結構2所示。

圖2 JSON數組結構

  如下的代碼是一個簡單的JSON數組樣本:

  ["北京","上海","廣州"]

1.3值的類型

  在JSON的對象和數組結構中,value值不僅可以是數字、字串等單一資料型別,還可以是對象、數組等,3所示。

圖3 JSON中值的類型

  因此,我們可以使用對象和數組的組合構成複雜的資料結構。如下的代碼使用對象結構定義了一個“students”對象,在“students”對象中包含了一個學生數組,而學生數組中的值又是JSON對象。

1     {2         "students":3         [4         {"name":"jack","age":23},5         {"name":"rose","age":24}6         ]7     }

 

2.在伺服器端產生JSON資料

  通常,用戶端在請求伺服器資料時,伺服器可以使用XML文檔、JSON資料或HTML的形式將資料發送給用戶端。

  那麼如何在伺服器端產生JSON資料呢?首先需要完成以下兩個準備工作。

  (1)我們需要使用MyEclipse建立了一個Web Project,這裡我將該工程命名為了“JsonDemoProject”,用來類比伺服器端的Web服務。

  (2)我們還需要在該工程中匯入JSON的API資料包json-lib-2.2.2-jdk15.jar。

  在JSON的API中,提供了JSONObject類,通過調用JSONObject類的put(Object key, Object value)方法,可以將一個Object對象以索引值對的形式存入JSONObject對象。通過調用JSONObject類的toString()方法,則可以將JSONObject對象轉化為JSON資料。

  如下的代碼建立了一個JsonTools類,並實現了靜態方法createJsonString(),用來產生JSON資料。

 1   public class JsonTools { 2        3       /* 4        * Function :   產生JSON資料 5        * Param   :  key        Json資料的索引值 6        *              object     要產生Json資料的內容 7        * Retuen  :   JSON資料 8        * Author  :   部落格園-依舊淡然 9        */10       public static String createJsonString(String key, Object value) {11           JSONObject jsonObject = new JSONObject();    //建立一個JSONObject對象12           jsonObject.put(key, value);                  //往JSONObject對象中填入內容13           return jsonObject.toString();                //產生JSON資料並返回14       }15       16   }

  通過使用該方法,我們可以很方便的將各種資料傳遞進來,並將其轉化成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     }

  其中,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(); 8          9         List<Person> listPerson = jsonService.getListPerson();10         11         String str = null;12         String action_flag = request.getParameter("action_flag");    //擷取URL參數13         if(action_flag.equals("persons")) {14             str = JsonTools.createJsonString("persons", listPerson);15         }16         out.println(str);17         out.flush();18         out.close();19     }

  可以看到,在doPost()方法中,我們通過調用getListPerson()方法獲得了Person對象列表listPerson,並將其傳入JsonTools.createJsonString()方法中,從而獲得了一串JSON資料。

  將該工程發布到Tomcat上,使用瀏覽器訪問該Web工程,可以看到4所示的介面,Person對象列表被成功的轉化成了JSON資料。

圖4 產生的JSON資料

 

3.在用戶端解析JSON資料

  通過上面的步驟,我們已經在伺服器上產生了JSON資料。要在我們的Android工程中擷取該JSON資料是很容易的,只需要利用Android為我們提供的HttpURLConnection介面訪問圖4所示的URL即可。

  那麼,擷取到伺服器上的JSON資料以後,如何在Android工程中完成對該JSON資料的解析呢?

  觀察圖4所示的JSON資料可以看出:

  (1)該JSON資料的最外層是JSONObject,JSONObject的鍵是“persons”,值是一個JSONArray。

  (2)在JSONArray中又包含了3個JSONObject對象。

  (3)而在內嵌的每一個JSONObject對象中,都有3個索引值對的組合。

  分析清楚了JSON資料的構成形式之後,就可以開始著手對其進行解析了。在Android工程中,我們可以建立一個JsonTools類,並實現getListPerson()類方法,用來完成把從伺服器獲得的Json資料解析出來,還原成Person對象列表。具體代碼如下所示:

 1     /* 2      * Function  :   解析JSON資料,還原成Person對象列表 3      * Param     :   key            Json資料的索引值 4      *               jsonString     從伺服器獲得的Json資料 5      * Retuen   :   Person對象列表 6      * Author    :   部落格園-依舊淡然 7      */ 8     public static List<Person> getListPerson(String key, String jsonString) { 9         List<Person> list = new ArrayList<Person>();10         try {11             JSONObject jsonObject = new JSONObject(jsonString);          //建立JSONObject對象12             JSONArray personArray = jsonObject.getJSONArray(key);        //擷取JSONObject對象的值,該值是一個JSON數組13             for(int i = 0; i < personArray.length(); i++) {14                 JSONObject personObject = personArray.getJSONObject(i);  //獲得JSON數組中的每一個JSONObject對象15                 Person person = new Person();16                 int id = personObject.getInt("id");                      //獲得每一個JSONObject對象中的鍵所對應的值17                 String name = personObject.getString("name");18                 int age = personObject.getInt("age");19                 person.setId(id);        //將解析出來的屬性值存入Person對象20                 person.setName(name);21                 person.setAge(age);22                 list.add(person);        //將解析出來的每一個Person對象添加到List中23             }24         } catch (JSONException e) {25             e.printStackTrace();26         }27         return list;28     }

  在本執行個體中,點擊Button按鈕向伺服器發送擷取JSON資料的請求,從伺服器獲得JSON資料後,可以使用以上的程式碼完成對JSON資料的解析,最後將解析得到的Person對象依次顯示在TextView控制項中。程式啟動並執行結果5所示。


圖5 運行結果

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.