【Android網絡開發の4】解析和生成JSON數據

什麼是json?一種輕量級的數據交換格式,具有良好的可讀和便於快速編寫的特性。
前面幾章講到了xml的解析和生成,本章講解下json的解析和生成
 
首先我們看下json和xml的異同處
1.JSON和XML的數據可讀性基本相同
2.JSON和XML同樣擁有豐富的解析手段
3.JSON相對於XML來講,數據的體積小
4.JSON與JavaScript的交互更加方便
5.JSON對數據的描述性比XML較差
6.JSON的速度要遠遠快於XML
JSON解析類可以分爲以下幾個類
 
    JSONObject:可以看作是一個json對象,這是系統中有關JSON定義的基本單元,其包含一對兒(Key/Value)數值。它對外部(External:   應用toString()方法輸出的數值)調用的響應體現爲一個標準的字符串(例如:{"JSON": "Hello, World"},最外被大括號包裹,其中的Key和Value被冒號":"分隔)。其對於內部(Internal)行爲的操作格式略微,例如:初始化一個JSONObject實例,引用內部的put()方法添加數值:new JSONObject().put("JSON", "Hello, World!"),在Key和Value之間是以逗號","分隔。Value的類型包括:Boolean、JSONArray、JSONObject、Number、String或者默認值JSONObject.NULL object 。
 
    JSONStringer:json文本構建類 ,根據官方的解釋,這個類可以幫助快速和便捷的創建JSON text。其最大的優點在於可以減少由於 格式的錯誤導致程序異常,引用這個類可以自動嚴格按照JSON語法規則(syntax rules)創建JSON text。每個 JSONStringer實體只能對應創建一個JSON text。。其最大的優點在於可以減少由於格式的錯誤導致程序異常,引用這個類可以自動嚴格按照JSON語法規則(syntax rules)創建JSON text。每個JSONStringer實體只能對應創建一個JSON text。
 
    JSONArray:它代表一組有序的數值。將其轉換爲String輸出(toString)所表現的形式是用方括號包裹,數值以逗號”,”分隔(例如:     [value1,value2,value3],大家可以親自利用簡短的代碼更加直觀的瞭解其格式)。這個類的內部同樣具有查詢行爲,     get()和opt()兩種方法都可以通過index索引返回指定的數值,put()方法用來添加或者替換數值。同樣這個類的value類型可以包括:Boolean、JSONArray、JSONObject、Number、String或者默認值JSONObject.NULL object。
 
    JSONTokener:json解析類 
    JSONException:json中用到的異常 

一、構建json
首先  我們來構建一個下面的簡單的json
  1. /** 
  2.      * 生成json 
  3.      * */ 
  4.     public String createJson() { 
  5.         // TODO Auto-generated method stub 
  6.  
  7.         try { 
  8.             JSONObject jsonObject = new JSONObject(); 
  9.             jsonObject.put("id""1"); 
  10.             jsonObject.put("name""李磊"); 
  11.             jsonObject.put("age""30"); 
  12.             return jsonObject.toString(); 
  13.         } catch (Exception e) { 
  14.             // TODO Auto-generated catch block 
  15.             e.printStackTrace(); 
  16.         } 
  17.         return ""
  18.     } 
得到的json數據爲:{"id":"1","name":"李磊","age":"30"}
這應該算是最簡單的一個json數據
實現的流程就是新建一個jsonobject對象,通過put將屬性添加到json
 
接下來 我們來創建一個帶有數組的json數據
  1. /** 
  2.  * 生成json 
  3.  * */ 
  4. public String createJson() { 
  5.     // TODO Auto-generated method stub 
  6.  
  7.     List<Person> persons = getTestValues(); 
  8.     try { 
  9.         JSONObject jsonObject = new JSONObject();
  10.  
  11.         JSONArray array = new JSONArray(); 
  12.         for (int i = 0; i < persons.size(); i++) { 
  13.             JSONObject person = new JSONObject(); 
  14.             Person p = persons.get(i); 
  15.             person.put("id", p.getId()); 
  16.             person.put("name", p.getName()); 
  17.             person.put("age", p.getAge()); 
  18.             array.put(person); 
  19.         } 
  20.         jsonObject.put("persons", array); 
  21.         System.out.println(jsonObject.toString()); 
  22.         return jsonObject.toString(); 
  23.     } catch (Exception e) { 
  24.         // TODO Auto-generated catch block 
  25.         e.printStackTrace(); 
  26.     } 
  27.     return ""
上面的代碼  我們得到的是這樣的數據
{"persons":[{"id":"1","age":"30","name":"李磊"},{"id":"2","age":"25","name":"韓梅梅"}]}
看了代碼之後就會發現  代碼很容易理解

1.創建最外層的{}對象jsonObject

2.創建數組對象 用來保存兩個人的信息

3.在循環內創建jsonObject對象 用來保存每個人的信息,別忘了添加完屬性之後 將對象添加到數組

4.將數組添加到最外層對象

 
我們除了使用jsonObject和jsonArray來創建json之外 我們還可以使用JSONStringer
  1. /** 
  2.  * 生成json 
  3.  * */ 
  4. public String createJson() { 
  5.     // TODO Auto-generated method stub 
  6.  
  7.     JSONStringer jsonStringer = new JSONStringer(); 
  8.     try { 
  9.         jsonStringer.object(); 
  10.         jsonStringer.key("id").value("1"); 
  11.         jsonStringer.key("name").value("李磊"); 
  12.         jsonStringer.key("age").value("30"); 
  13.         jsonStringer.endObject(); 
  14.          
  15.         System.out.println(jsonStringer.toString()); 
  16.     } catch (Exception e) { 
  17.         // TODO Auto-generated catch block 
  18.         e.printStackTrace(); 
  19.     } 
  20.      
  21.     return jsonStringer.toString(); 
上面的代碼   我們得到了這樣的數據{"id":"1","name":"李磊","age":"30"}
和第一次獲取的一塊 接下來  我們講下大概

1. 首先 新建JSONStringer對象

2. 調用object()方法 說明開始創建 添加了頭{(當然,要和endobject成對出現)

3. 添加一個屬性 通過key("name") 添加了屬性了名稱  通過value("value") 添加了屬性的值

4. 添加完所有內容之後,調用endobject()方法通知json創建完畢

好了  接下來我們使用JSONStringer創建一個帶有數組的json數據
  1. /** 
  2.  * 生成json 
  3.  * */ 
  4. public String createJson() { 
  5.     // TODO Auto-generated method stub 
  6.  
  7.     List<Person> persons = getTestValues(); 
  8.     JSONStringer jsonStringer = new JSONStringer(); 
  9.     try { 
  10.         jsonStringer.object(); 
  11.         jsonStringer.key("persons"); 
  12.         jsonStringer.array(); 
  13.          
  14.         for (int i = 0; i < persons.size(); i++) { 
  15.             Person person = persons.get(i); 
  16.              
  17.             jsonStringer.object(); 
  18.             jsonStringer.key("id").value(person.getId()); 
  19.             jsonStringer.key("name").value(person.getName()); 
  20.             jsonStringer.key("age").value(person.getAge()); 
  21.             jsonStringer.endObject(); 
  22.         } 
  23.         jsonStringer.endArray(); 
  24.          
  25.         jsonStringer.endObject(); 
  26.          
  27.         System.out.println(jsonStringer.toString()); 
  28.     } catch (Exception e) { 
  29.         // TODO Auto-generated catch block 
  30.         e.printStackTrace(); 
  31.     } 
  32.      
  33.     return jsonStringer.toString(); 
看下生成的字符串
{"persons":[{"id":"1","name":"李磊","age":"30"},{"id":"2","name":"韓梅梅","age":"25"}]}
是我們需要的數據

1.創建一個新的JSONStringer對象 用來存儲生成的json數據

2.首先調用key("persons") 添加數組的key值

3.調用array()通知系統 接下來的是一個數組 (和endarray()一起出現)

4.在循環內部通過object()方法  創建一對{} 然後將屬性添加到大括號內

上面的代碼我們講了怎麼去生成json數據

二、解析JSON
接下來我們來解析一個最簡單的json數據 數據爲{"id":"1","name":"李磊","age":"30"}
我們來看下解析的代碼
  1. /** 
  2.      * 解析json 
  3.      * */ 
  4.     public Person parserJson() { 
  5.         // TODO Auto-generated method stub 
  6.  
  7.         String json = "{\"id\":\"1\",\"name\":\"李磊\",\"age\":\"30\"}"
  8.  
  9.         Person person = new Person(); 
  10.         try { 
  11.             JSONTokener jsonTokener = new JSONTokener(json); 
  12.              // 此時還未讀取任何json文本,直接讀取就是一個JSONObject對象。   
  13.             // 如果此時的讀取位置在"name" : 了,那麼nextValue就是"李磊"(String)   
  14.             JSONObject jsonObject = (JSONObject) jsonTokener.nextValue(); 
  15.             person.setId(jsonObject.getString("id")); 
  16.             person.setName(jsonObject.getString("name")); 
  17.             person.setAge(jsonObject.getString("age")); 
  18.  
  19.         } catch (Exception e) { 
  20.             // TODO Auto-generated catch block 
  21.             e.printStackTrace(); 
  22.         } 
  23.         return person; 
  24.     } 
我們解析的步驟

1.將json字符串轉換爲jsonTokener對象

2.調用jsonTokener的nextValue()方法  將json數據轉換爲jsonObject對象

3.通過getString(keyname)獲取需要的值

當然 nextValue()獲取的不一定是jsonObject對象,詳細解釋看代碼註釋
 
接下來  我們要來解析這樣的數據,帶有數組哦~
{"persons":[{"id":"1","name":"李磊","age":"30"},{"id":"2","name":"韓梅梅","age":"25"}]}
不難  上代碼
  1. public List<Person> parserJson() { 
  2.         // TODO Auto-generated method stub 
  3.  
  4.         String json = "{\"persons\":[{\"id\":\"1\",\"name\":\"李磊\",\"age\":\"30\"},{\"id\":\"2\",\"name\":\"韓梅梅\",\"age\":\"25\"}]}"
  5.  
  6.         List<Person> persons = new ArrayList<Person>(); 
  7.         try { 
  8.             JSONTokener jsonTokener = new JSONTokener(json); 
  9.             // 此時還未讀取任何json文本,直接讀取就是一個JSONObject對象。 
  10.             // 如果此時的讀取位置在"name" : 了,那麼nextValue就是"李磊"(String) 
  11.             JSONObject jsonObject = (JSONObject) jsonTokener.nextValue(); 
  12.             JSONArray array = jsonObject.getJSONArray("persons"); 
  13.             for (int i = 0; i < array.length(); i++) { 
  14.                 JSONObject object = array.getJSONObject(i); 
  15.                 Person person = new Person(); 
  16.                 person.setId(object.getString("id")); 
  17.                 person.setName(object.getString("name")); 
  18.                 person.setAge(object.getString("age")); 
  19.                 persons.add(person); 
  20.             } 
  21.  
  22.         } catch (Exception e) { 
  23.             // TODO Auto-generated catch block 
  24.             e.printStackTrace(); 
  25.         } 
  26.         return persons; 
  27.     } 
 同樣的  我們來解釋下代碼

1.創建一個list 用來存儲解析的信息

2.將json字符串轉換爲jsonTokener對象,再轉換爲jsonObject對象

3.通過getJSONArray("persons")獲取json數組

4.通過循環來解析json數組,解析的內容不解釋,上面已經說過

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