標籤:android開發 json gson
轉載請註明出處:http://blog.csdn.net/zhaokaiqiang1992
因為在之前的項目中,xml和json資料格式都有使用過,所以對json格式的簡單、高效的特點印象深刻。如果使用json語言進行開發,強烈推薦使用json資料格式!
JSON(JavaScript Object Notation) 是一種輕量級的資料交換格式。 易於人閱讀和編寫。同時也易於機器解析和產生。 JSON採用完全獨立於語言的文字格式設定,但是也使用了類似於C語言家族的習慣(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 這些特性使JSON成為理想的資料交換語言。
JSON建構於兩種結構:
(1)“名稱/值”對的集合(A collection of name/value pairs)。不同的語言中,它被理解為對象(object),紀錄(record),結構(struct),字典(dictionary),雜湊表(hash table),有鍵列表(keyed list),或者關聯陣列 (associative array)。
(2)值的有序列表(An ordered list of values)。在大部分語言中,它被理解為數組(array)。
因為這種資料結構在大部分現代電腦語言都以某種形式存在。所以使得一種資料格式在同樣基於這些結構的程式設計語言之間交換成為可能。比如給android和ios寫api介面的時候,採用json格式就可以實現跨平台支援。
1.索引值對形式:
這種方式我們可以對應java裡的map結構。一個對象以“{”(左括弧)開始,“}”(右括弧)結束。每個“名稱”後跟一個“:”(冒號);“‘名稱/值’ 對”之間使用“,”(逗號)分隔。
下面是一個索引值對形式的簡單樣本:
{
"name": "zhao",
"age": 22,
"address": "QingDao"
}
前面的鍵是String字串,但是後面的值卻可以是多種類型,比如字串、bool、數值、null、對象甚至是數組。
下面是一個值是對象的簡單樣本:
{
"name": "zhao",
"age": 22,
"address": "QingDao",
"birthday": {
"year": 19,
"month": 1,
"day": 19
}
}
我們可以使用下面的圖表示這種形式
2.數組形式
數組是值(value)的有序集合。一個數組以“[”(左中括弧)開始,“]”(右中括弧)結束。值之間使用“,”(逗號)分隔。
對應於java裡面的類,我們可以認為這是一個可以放object的數組,值(value)可以是雙引號括起來的字串(string)、數值(number)、true、false、 null、對象(object)或者數組(array)。這些結構可以嵌套。
下面是一個使用數組形式的樣本:
[
"zhaokaiqiang",
22,
"QingDao",
{
"year": 1992,
"month": 1,
"day": 19
},
true,
null
]
我們可以使用下面的這個圖表示這種形式
value的取值可以使用下面的圖片表示
如果在字串裡面有需要轉義的字元的話,可以參考下面的關於轉義的說明
Json資料格式就這麼點東西,非常的簡單明了。Android裡面內建的org.json包裡面的類,可以產生Json格式的資料或者是對Json格式的資料進行解析。
下面簡單的介紹一下Android裡面的json相關類的使用,但是強烈不推薦大家使用android內建的json相關類!
和json相關的類就下面5個,下面分別介紹這幾個類的用法
1.JSONObject
這個類主要對json索引值對形式的資料操作進行了封裝,下面是常用的幾個方法:
JSONObject.put(key,values);//添加,用於產生json
JSONObject.get(key);//擷取,用於解析json
JSONObject.optXXX(key);//也是用於擷取,在解析的時候會用到,但是不會拋出異常,而是返回預設的值
如果我們要產生索引值對形式的字串,那麼可以使用這個類,就像下面的代碼
public void objectToJson() throws Exception {JSONObject jsonObject = new JSONObject();jsonObject.put("name", "zhaokaiqiang");jsonObject.put("age", 22);Log.d(TAG, jsonObject.toString());}
結果如下:
{"age":22,"name":"zhaokaiqiang"}
因為沒有一個方法可以直接轉換,所以只能這樣自己設定key和value,很麻煩。
2.JSONArray
這個類主要是對有序的數組形式的操作進行了封裝。常用方法與JSONObject類似:
JSONArray.put(key,values);//添加,用於產生json
JSONArray.get(key);//擷取,用於解析json
JSONArray.optXXX(key);//也是用於擷取,在解析的時候會用到,但是不會拋出異常,而是返回預設的值
下面是一個使用的小樣本:
public void objectToJson() throws Exception {JSONArray jsonArray = new JSONArray();Person p = new Person("zhaokaiqiang", 22, new Birthday(1992, 1, 19));jsonArray.put("toJson");jsonArray.put(100);jsonArray.put(true);jsonArray.put(p);Log.d(TAG, jsonArray.toString());}
下面是測試結果:
["toJson",100,true,"Person [name=zhaokaiqiang, age=22, birthday=Birthday [year=1992, month=1, day=19]]"]
當我們在JSONArray裡面添加對象的時候,其實是將對象的toString()方法的字串插入了進去,這樣對於我們還原序列化,非常的不方便,這也是為什麼我不推薦使用這個類的原因。
3.JSONStringer
這個類是用來方便我們構建json格式的字串的。下面是常用的方法:
JSONStringer.object();//開始構建一個索引值對形式的json
JSONStringer.key(name);//添加一個key
JSONStringer.values(value);//添加value
JSONStringer.endObject();//結束索引值對形式的json的構建
當然,也可以構建數組形式的,都是一樣的用法,不過多解釋了,下面給出一個簡單的樣本
public void jsonStringerToJson() throws Exception {JSONStringer jsonStringer = new JSONStringer();jsonStringer.object();jsonStringer.key("name");jsonStringer.value("zhaokaiqiang");jsonStringer.key("age");jsonStringer.value(22);jsonStringer.key("birthday");jsonStringer.value(new Birthday(1992, 1, 19));jsonStringer.endObject();Log.d(TAG, jsonStringer.toString());}
下面是輸出結果
{"name":"zhaokaiqiang","age":22,"birthday":"Birthday [year=1992, month=1, day=19]"}
如果想產生數組形式的json,只需要把object換成array即可。
4.JSONTokener
這個類是用來對json文本進行解析的,功能比較弱。
下面直接給處一個範例程式碼:
public void fromJson() throws Exception {JSONStringer jsonStringer = new JSONStringer();jsonStringer.object();jsonStringer.key("name");jsonStringer.value("zhaokaiqiang");jsonStringer.key("age");jsonStringer.value(22);jsonStringer.endObject();String jsonString = jsonStringer.toString();Log.d(TAG, "產生的json----------" + jsonString);JSONTokener jsonTokener = new JSONTokener(jsonString);JSONObject jsonObject = (JSONObject) jsonTokener.nextValue();String name = jsonObject.getString("name");int age = jsonObject.getInt("age");Log.d(TAG, "name=" + name);Log.d(TAG, "age=" + age);}
下面是輸出結果
11-26 14:15:37.842: D/JsonTest(10053): 產生的json----------{"name":"zhaokaiqiang","age":22}11-26 14:15:37.842: D/JsonTest(10053): name=zhaokaiqiang11-26 14:15:37.842: D/JsonTest(10053): age=22
5.JSONException
這個是我們解析過程中出現錯誤,比如說如果想下面這樣,就會拋出異常
jsonObject.getString("age");
因為"age"對應的欄位是int類型,如果按照String讀取,就會出現這種錯誤。
最後要說的:因為Android內建的json相關的類功能太弱了,所以強烈不推薦使用!這些東西知道就可以,防止看其他人的代碼碰到看不懂。下面的文章我會介紹更好用,更加高效的json資料格式的解析和產生,比如google的gson,敬請期待。
【Android開發經驗】Json資料格式介紹、使用Android內建類庫完成Json產生與解析