很多應用程式開發時,傳遞都會使用 Json 作為規範格式,像是 Plurk API、Facebook API ... 等等,都是採用 Json 作為傳遞格式,因為它具備輕量化、易於閱讀的優點,其他詳細內容就不多做介紹了,詳細說明請見 JSON (JavaScript Object Notation) 維基百科吧!
Json 格式以 Object、Array 作為兩大形式,用法如下:
一、物件形式 {}
1 2 3 4
| { "Key1": "Value1", "Key2": "Value2" }
|
二、陣列刑式 []
1 2 3 4
| [ "Value1", "Value2" ]
|
再來介紹 Json 支援的型態,總共有 String、Number、Boolean,用法如下:
一、String 字串 型態
二、Number 整數 型態
三、Boolean 布林 型態
既然基本教學都講完了,那我們來個簡單的隨堂小練習吧!我希望定義一個 Json 格式,這格式會傳遞每間教室的詳細資料(教室編號、教室名稱),每間教室還會記載歸屬學生的資料(學生編號、學生姓名),那這樣的 Json 該如何定義呢?
如果是我的話,我大概會想這樣定義:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| [ { "教室資訊 (Class Detail)" : { "教室編號 (Class Number)" : "", "教室名稱 (Class Name)" : "" }, "學生資訊 (Student Detail)" : [ { "學生編號 (Student Number)" : "", "學生名稱 (Student Name)" : "" } ] } ]
|
當然方法有很多種!我只是其中一種方法而已,我們接下來看看用那樣的方法會變成什麼樣子吧!
假設有三間教室,編號分別為 Class01、Class02、Class03
電腦教室 (Class01) 的學生:
- Student0101 小明1號
- Student0102 小明2號
- Student0103 小明3號
- Student0104 小明4號
音樂教室 (Class02) 的學生:
- Student0201 小智1號
- Student0202 小智2號
童軍教室 (Class03) 的學生:
- Student0301 小春1號
- Student0302 小春2號
- Student0303 小春3號
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| [ { "ClassDetail" : { "ClassNumber" : "Class01", "ClassName" : "電腦教室" }, "StudentDetail" : [ { "StudentNumber" : "Student0101", "StudentName" : "小明1號" }, { "StudentNumber" : "Student0102", "StudentName" : "小明2號" }, { "StudentNumber" : "Student0103", "StudentName" : "小明3號" }, { "StudentNumber" : "Student0104", "StudentName" : "小明4號" } ] }, { "ClassDetail" : { "ClassNumber" : "Class02", "ClassName" : "音樂教室" }, "StudentDetail" : [ { "StudentNumber" : "Student0201", "StudentName" : "小智1號" }, { "StudentNumber" : "Student0202", "StudentName" : "小智2號" } ] }, { "ClassDetail" : { "ClassNumber" : "Class03", "ClassName" : "童軍教室" }, "StudentDetail" : [ { "StudentNumber" : "Student0301", "StudentName" : "小春1號" }, { "StudentNumber" : "Student0302", "StudentName" : "小春2號" }, { "StudentNumber" : "Student0303", "StudentName" : "小春3號" } ] } ]
|
接下來就要進入我們的主題囉!該如何在 Java 或 Android 當中,讀取 Json 的資料呢?我們先預想一整條 Json 就是一整串 String 字串吧!從最外層來看,這整個所有資料是包在一個 Json Array 當中,所以我們必須使用 JSONArray 來做初次的處理:
1 2
| JSONArray jsonArray = new JSONArray("Your Json String");
|
解析完 JSONArray 之後,每個教室都是用 JSONObject 給包起來的,再來如果想要批次的把每間教室一條一條讀出來,我們就可以這樣做:
1 2 3 4 5 6 7 8 9 10 11 12 13
| JSONArray jsonArray = new JSONArray("Your Json String");
for (int i = 0; i < jsonArray.length(); i++) { JSONObject jsonObject = jsonArray.getJSONObject(i); JSONObject classDetailJson = jsonObject.getJSONObject("ClassDetail"); System.out.println("ClassNumber => " + classDetailJson.getString("ClassNumber")); System.out.println("ClassNumber => " + classDetailJson.getString("ClassName")); }
|
當然我們讀完教室後,我們還可以再來讀教室裡面的學生!因為封裝的方法是把 學生(Data) 包成 JSONObject,然後把 學生們(JSONObject) 包成 JSONArray,然後把 學生們(JSONArray) 掛載在所屬的教室當中,所以現在我們要逆著解析回來:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| JSONArray jsonArray = new JSONArray("Your Json String");
for (int i = 0; i < jsonArray.length(); i++) { JSONObject jsonObject = jsonArray.getJSONObject(i); JSONObject classDetailJson = jsonObject.getJSONObject("ClassDetail"); System.out.println("ClassNumber => " + classDetailJson.getString("ClassNumber")); System.out.println("ClassNumber => " + classDetailJson.getString("ClassName"));
JSONArray students = jsonObject.getJSONArray("StudentDetail"); for (int i = 0; i < jsonArray.length(); i++) { JSONObject student = students.getJSONObject(i); System.out.println("StudentNumber => " + student.getString("StudentNumber")); System.out.println("StudentName => " + student.getString("StudentName")); } }
|
以上大約為在 Java 或 Android 當中,該如何讀取、解析 Json 的教學,至於還有沒有進階用法嘛 ... 大概就 ...
1 2 3 4 5 6 7 8 9 10 11
|
JSONObject.isNull("Key");
JSONObject.keys();
|
如果你真的對 org.json 很有興趣,那也當然歡迎多看看 org.json 的相關資料 ...
另外我很喜歡用一套線上 JSON 編輯器,也一起分享給大家:JSON Editor Online