觀念:
JSON(Java Script Object Notation) 是種超輕量數據交換格式, 只有兩種組成元素
(a) object 定義是以key : value的方式表示, 最外層會用{}包覆, key值使用字串,
然後用 : 隔開 value值, 每組key : value 用 , 來隔開, 舉例如下:
{ "string": "Hello World" , "int" : 123}
(b) array 定義是以[]來包覆一連串的value, 各value中間用, 來隔開, 舉例如下:
[1,2,3, 45, "abc"]
接著在value的定義上, 可以是 string, number, object, array, true, false, null
而一些特定符號則是用 \ 這跳脫字元來表示, 像是 \" 來表示"
最後在number的定義則是去除8和16進位格式, 但是有科學記號e
1. 首先介紹一下JSON的官網http://www.json.org/ ,
建議是可以讀一遍, 上面有各國語言的選項, 按下中文就可以快速理解了
2. 接著介紹一個線上解析JSON格式的網站 http://jsoneditoronline.org/
通常拿到JSON格式的資料, 建議先貼上去檢查一下, 避免解讀一值不出來,
結果是JSON格是有錯的大烏龍
3. 在來到android官網http://developer.android.com/reference/org/json/package-summary.html
查看JSON相關文件, 總共就四種類別
JSONArray | 定義了JSON Array的物件 |
JSONObject | 定義了JSON Object的物件 |
JSONStringer | 用來建造JSON格式的文件 |
JSONTokener | 用來解析JSON類別 |
4. 接著點開JSONTokener的頁面, 利用官方介紹的方法來建立一個JSONObject
5. 開啟Eclipse, 先宣告一個字串, 然後建立JSON格式的字串內容,
這邊就按照步驟2網頁預設的值來建立一個字串, 要注要的是 利用 \" 來表達內文的"
字串的內文如下:
String jsonObj = "{"
+ " \"array\":[1, 2, 3], "
+ " \"boolean\": true, "
+ " \"null\": null,"
+ " \"object\": { \"a\": \"b\", \"c\": \"d\", \"e\": \"f\" },"
+ " \"string\": \"Hello World\" "
+ "}";
6. 接著利用Log的方法來印出剛剛建立的字串
7. 可以利用DDMS 在後台看到印出來的字串確認是否正確
8. 宣告一個JSONObject, 並給予剛建立字串的值
JSONObject object = (JSONObject) new JSONTokener(jsonObj).nextValue();
9. 由於JSON IO 會有例外, 所以要用try catch來處理
10. 然後開始解析JSON物件, 第一個物件就是array, 所以宣告一個JSON Array
並利用getJSONArray("key值")的方式把值放進去
JSONArray array = object.getJSONArray("array");
11. JSONArray 是利用 .get資料型態(索引)的方式來取值,
這例子的值剛好是int, 所以用getInt, 如果是字串 就是用getString
然後這邊有3個值, 分別就用3個變數來裝它
12. 取得值之後, 用Log來檢驗是否正確
13. 進入DDMS可以看到, 確實得到正確值了
14. 接著是boolean值, 再度回到JSONObject, 用.get資料型態("Key值")來取得
所以宣告一個boolean值來裝, 並用Log把他印出來
boolean bl = object.getBoolean("boolean");
Log.d(TAG, "boolean = "+ bl);
15. 接著是Null值, 這邊可以用.isNull("Key值")來判斷, 並用Log印出來
boolean isNull = object.isNull("null");
Log.d(TAG, "isNull = "+ isNull);
16. 接著是Object內裝著Object, 原理一樣, 就在用一個Object來裝
之後再去解析, 並在最後用Log印出來
JSONObject obj = object.getJSONObject("object");
String o0 = obj.getString("a");
String o1 = obj.getString("c");
String o2 = obj.getString("e");
Log.d(TAG, "o0="+o0+", o1="+o1+", o2="+o2);
17. 最後的value是一個String, 所以用.getString("Key值")來取得
String string = object.getString("string");
Log.d(TAG, "string = "+ string);
18. 最後到DDMS那邊看剛剛所取得的結果, 就成功解析了這例子