很多應用程式開發時,傳遞都會使用 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 字串 型態

1
2
3
{
"Key": "Value"
}

二、Number 整數 型態

1
2
3
{
"Key": 0
}

三、Boolean 布林 型態

1
2
3
{
"Key": true
}

既然基本教學都講完了,那我們來個簡單的隨堂小練習吧!我希望定義一個 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
// (1.) 將 JSON String 解析為 JSONArray
JSONArray jsonArray = new JSONArray("Your Json String");

解析完 JSONArray 之後,每個教室都是用 JSONObject 給包起來的,再來如果想要批次的把每間教室一條一條讀出來,我們就可以這樣做:

1
2
3
4
5
6
7
8
9
10
11
12
13
// (1.) 將 JSON String 解析為 JSONArray
JSONArray jsonArray = new JSONArray("Your Json String");
// (2.) 利用 for 來將每一筆 JSONObject 給讀出來
for (int i = 0; i < jsonArray.length(); i++) {
// (2.) 取得每一條 教室(JSONObject)
JSONObject jsonObject = jsonArray.getJSONObject(i);
// (2.) 取得 教室(JSONObject) 當中 "教室資訊(ClassDetail)" 這項 JSONObject
JSONObject classDetailJson = jsonObject.getJSONObject("ClassDetail");
// (2.) 取得 教室資訊(ClassDetail) 當中的 教室編號(ClassNumber)
System.out.println("ClassNumber => " + classDetailJson.getString("ClassNumber"));
// (2.) 取得 教室資訊(ClassDetail) 當中的 教室名稱(ClassName)
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
// (1.) 將 JSON String 解析為 JSONArray
JSONArray jsonArray = new JSONArray("Your Json String");
// (2.) 利用 for 來將每一筆 JSONObject 給讀出來
for (int i = 0; i < jsonArray.length(); i++) {
// (2.) 取得每一條 教室(JSONObject)
JSONObject jsonObject = jsonArray.getJSONObject(i);
// (2.) 取得 教室(JSONObject) 當中 "教室資訊(ClassDetail)" 這項 JSONObject
JSONObject classDetailJson = jsonObject.getJSONObject("ClassDetail");
// (2.) 取得 教室資訊(ClassDetail) 當中的 教室編號(ClassNumber)
System.out.println("ClassNumber => " + classDetailJson.getString("ClassNumber"));
// (2.) 取得 教室資訊(ClassDetail) 當中的 教室名稱(ClassName)
System.out.println("ClassNumber => " + classDetailJson.getString("ClassName"));

// (3.) 取得 學生們(JSONArray) 的資料
JSONArray students = jsonObject.getJSONArray("StudentDetail");
// (3.) 利用 for 來將每一筆 學生(JSONObject) 給讀出來
for (int i = 0; i < jsonArray.length(); i++) {
// (3.) 取得每一位 學生(Student)
JSONObject student = students.getJSONObject(i);
// (3.) 取得 學生(Student) 當中的 學生編號(StudentNumber)
System.out.println("StudentNumber => " + student.getString("StudentNumber"));
// (3.) 取得 學生(Student) 當中的 學生名稱(StudentName)
System.out.println("StudentName => " + student.getString("StudentName"));
}
}

以上大約為在 Java 或 Android 當中,該如何讀取、解析 Json 的教學,至於還有沒有進階用法嘛 ... 大概就 ...

1
2
3
4
5
6
7
8
9
10
11
/**
* 判斷是否為 Null
* @return Boolean
*/
JSONObject.isNull("Key");

/**
* 取得所有的 Key
* @return <String>
*/
JSONObject.keys();

如果你真的對 org.json 很有興趣,那也當然歡迎多看看 org.json 的相關資料 ...

另外我很喜歡用一套線上 JSON 編輯器,也一起分享給大家:JSON Editor Online