Android中JSON的解析
android中網絡數據傳輸是經常被用到的,通常我們使用xml或者json,而json更加輕量,便捷,我們使用的更多。我自己在項目中使用很多,今天就說說android中怎么去解析JSON,幫助自己總結內容,同時幫助別人少走彎路。
JSON語法
首先看JSON的語法和結構,這樣我們才知道怎么去解析它。JSON語法時JavaScript對象表示語法的子集。
JSON的值可以是:
數字(整數或者浮點數)
字符串(在雙引號內)
邏輯值(true 或 false)
數組(使用方括號[]包圍)
對象( 使用花括號{}包圍)
null
JSON中有且只有兩種結構:對象和數組。
1、對象:對象在js中表示為“{}”括起來的內容,數據結構為 {key:value,key:value,…}的鍵值對的結構,在面向對象的語言中,key為對象的屬性,value為對應的屬性值,所以很容易理解,取值方法為 對象.key 獲取屬性值,這個屬性值的類型可以是 數字、字符串、數組、對象幾種。
2、數組:數組在js中是中括號“[]”括起來的內容,數據結構為 [“java”,“javascript”,“vb”,…],取值方式和所有語言中一樣,使用索引獲取,字段值的類型可以是 數字、字符串、數組、對象幾種。
andoroid解析JSON
android sdk中為我們提供了org.json,可以用來解析json,在android3.0又為在android.util包JsonReader和JsonWriter來進行json的解析和生成。
使用org.json包JSONObject和JSONArray進行解析
我們知道json中就兩種結構array和object,因此就有這個兩個類進行解析。
如我們有下面幾個json字符串:
{"name":"sam","age":18,"weight":60} //json1 一個json對象 [12,13,15] //json2 一個數字數組 [{"name":"sam","age":18},{"name":"leo","age":19},{"name":"sky", "age":20}] //json3 json array中有object
第一個json對象json1的解析
JSONObject jsonObj = new JSONObject(json1); String name = jsonObj.optString("name"); int age = jsonObj.optInt("age"); int weight = jsonObj.optInt("weight");
另外還有
Object opt(String name) boolean optBoolean(String name) double optDouble(String name) JSONArray optJSONArray(String name) JSONObject optJSONObject(String name)
等方法,我推薦用這些方法,這些方法在解析時,如果對應字段不存在會返回空值或者0,不會報錯。
當然如果你使用以下方法
Object get(String name) boolean getBoolean(String name) int getInt(String name)
等方法時,代碼不會去判斷是否存在該字段,需要你自己去判斷,否則的話會報錯。自己判斷的話使用has(String name)
來判斷。
再來看解析數組,簡單的數組。第二個json2
JSONArray jsonArray = new JSONArray(json2); for (int = 0; i < jsonArray.length();i++) { int age = jsonArray.optInt(i); }
解析復雜數組,包含對象,json3
JSONArray jsonArray = new JSONArray(json3); for (int = 0; i < jsonArray.length();i++) { JSONObject jsonObject = jsonArray.optJSONObject(i); String name = jsonObject.optString("name"); int age = jsonObject.optInt("age"); }
從上面可以看到數組的話解析方法和對象差不多,只是將鍵值替換為在數組中的下標。另外也是有optXXX(int index)和getXXX(int index)方法的,opt也是安全的,即對應index無值的時候,不會報錯,返回空,推薦使用。
使用JsonReader進行解析
JsonReader的使用其實和xml解析中的pull是有一點類似的,我們來看示例。
前面的JSONObject和JSONArray創建時傳的是String,而JsonReader需要傳入的時候是Reader,網絡訪問中,我們可以直接拿輸入流傳進來,轉成Reader。我們這里假設我們上面的String已經轉成InputStream了,分別為jsonIs1,jsonIs2,jsonIs3。
上面的json1解析:
JsonReader reader = new JsonReader(new InputStreamReader(jsonIs1)); try {積分:49排名:第1495693名上傳資源:1 reader.beginObject(); while (reader.hasNext()) { String keyName = reader.nextName(); if (keyName.equals("name")) { String name = reader.nextString(); } else if (keyName.equals("age")) { int age = reader.nextInt(); } else if (keyName.equals("weight")) { int weight = reader.nextInt(); } } reader.endObject(); } finally { reader.close(); }
上面json2的解析:
JsonReader reader = new JsonReader(new InputStreamReader(jsonIs2)); try { List<Integer> ages = new ArrayList<Integer>(); reader.beginArray(); while (reader.hasNext()) { ages.add(reader.nextInt()); } reader.endArray(); } finally { reader.close(); }
第三個我就不寫示例了。
看到這個的話是通過去遍歷我們的json,去取得我們的內容,我覺得在效率上面會比第一種效率高一些。具體使用的話就按照我這兩個例子可以寫出來的。
使用GSON解析JSON
GSON是谷歌出品,很好用。同時呢還有一些其他的第三方的比如fastjson等,都和Gson差不多,傳一個string和要轉換的對象,幫你直接直接解析出來,不再需要我們自己一個字段一段字段的解析。這里就以Gson為例吧,因為我只用過Gson,對其最熟悉。_
使用Gson,我們需要導入Gson的包,下載地址https://code.google.com/p/google-gson/downloads/list。
現在開始看看,怎么解析上面的三個json字符串例子。
第一個對象json1
首先我們需要一個實體類
public class People{ public String name; @SerializedName(age) pubic int mAge; //如果我們類中成員的名稱和json對象中的鍵名不同,可以通過注解來設置名字 public int weight; }
然后就可以解析了
Gson gson = new Gson(); Poeple people = gson.fromJson(json1, People.class);
對于第二個json2,我們可以解析成int數組,也可以解析成Integer的List。
解析成數組:
Gson gson = new Gson(); int[] ages = gson.fromJson(json2, int[].class);
解析成List:
Gson gson = new Gson(); List<Integer> ages = gson.fromJson(json2, new TypeToken<List<Integer>>(){}.getType);
第三個同樣可以解析成List或者數組,我們就直接解析成List.
Gson gson = new Gson(); List<People> peoples = gson.fromJson(json3, new TypeToke<List<People>>(){}.getType);
從上面的代碼看到,使用Gson解析的話就非常簡單了。需要注意的是如果對應的鍵值和成員名稱不同的話可以使用注解來標記。
閑扯
上面就說清了主流的一些解析,可以看到使用Gson之后解析是十分簡單,這可以為我們的開發節約很多的時間。同時呢android本身為我們提供的也挺夠用的,并且3.0后增加的JsonReader操作更加流暢,和其他如Pull解析xml的方式有些類似。
本文中僅僅介紹了使用,還有一些api以及高級用法沒有提到,畢竟一篇文章能描寫的有限,請自行查看官方文檔。
上面說的只是解析,其實還有json的生成,JSONObject,JSONArray,都可以直接生成json的,3.0也提供了JsonWriter來生成json。而Gson中,直接gson.toJson(),就可以生成json了,一切都是這么的美妙。不過我們平時,生成json使用比較少,我這里就不寫了(或者單獨寫一篇生成)_。
參考資料地址: