android中網絡數據傳輸是常常被用到的,一般咱們使用xml或者json,而json更加輕量,便捷,咱們使用的更多。我本身在項目中使用不少,今天就說說android中怎麼去解析JSON,幫助本身總結內容,同時幫助別人少走彎路。javascript
##JSON語法
首先看JSON的語法和結構,這樣咱們才知道怎麼去解析它。JSON語法時JavaScript對象表示語法的子集。html
JSON的值能夠是:java
數字(整數或者浮點數)android
字符串(在雙引號內)json
邏輯值(true 或 false)api
數組(使用方括號[]包圍)數組
對象( 使用花括號{}包圍)安全
null網絡
JSON中有且只有兩種結構:對象和數組。數據結構
一、對象:對象在js中表示爲「{}」括起來的內容,數據結構爲 *{key:value,key:value,...}*的鍵值對的結構,在面向對象的語言中,key爲對象的屬性,value爲對應的屬性值,因此很容易理解,取值方法爲 對象.key 獲取屬性值,這個屬性值的類型能夠是 數字、字符串、數組、對象幾種。
二、數組:數組在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使用比較少,我這裏就不寫了(或者單獨寫一篇生成)^_^。
參考資料地址:
http://developer.android.com/reference/org/json/JSONArray.html
http://developer.android.com/reference/org/json/JSONObject.html
http://developer.android.com/reference/android/util/JsonReader.html
原文地址:http://blog.isming.me/blog/2014/06/04/parse-json-in-android/,歡迎轉載,轉載請註明出處。