JSON格式的資料交換非常常見
而Java中常用來處理JSON格式資料的函式庫為json.jar
裡面最常用到的兩個物件為JSONObject和JSONArray
JSONObject用來處理key、value形式的資料
JSONArray則是處理list或陣列形式的資料
1.建立JSON字串
首先建立JSONObject物件,並使用put(key,value)設定值:
JSONObject object = new JSONObject();
object.put("name", "Leon");
object.put("age", 18);
object.put("isSingle", true);
System.out.println(object.toString());
//{"isSingle":true,"name":"Leon","age":18}
//object.remove("age");
//移除不要的值
其中key值只能是字串,而value值可以是任何物件
設定完內容後使用toString()變成JSON字串
若設定錯的話可以使用remove移除掉不要的值
如果想要建立陣列的話則建立JSONArray物件
使用put(value)設定值或是put(index,value)指定陣列位置:
JSONArray array = new JSONArray();
array.put("rice");
array.put("noodles");
array.put(18);
object.put("eating", array);
System.out.println(object.toString());
// {"isSingle":true,"name":"Leon","eating":["rice","noodles",18],"age":18}
System.out.println(array.toString());
// ["rice","noodles",18]
這裡array可以不用統一內容的型別,都會被視為object
2. 解析JSON字串
在建構式裡面傳入JSON字串
String jsonString = "{\"isSingle\":true,\"name\":\"Leon\",\"eating\":[\"rice\",\"noodles\",18],\"age\":18}";
JSONObject object2 = new JSONObject(jsonString);
System.out.println(object2.toString());
// {"isSingle":true,"name":"Leon","eating":["rice","noodles",18],"age":18}
JSONObject要取值的時候
(1)使用get(key)
get(key)會取得key值對應的value值
而取得的型態為Object,之後再轉成自己想要的型態
object2.get("isSingle");
//true,但是是一個Object型別的物件
(2)使用getXXX(key)
XXX的部分為型別,所以有getString、getInt、getBoolean…等等
用該方法會將value值自動轉為該對應的型別
但如果沒辦法轉型的話會拋出例外
另外還有getJSONArray和getJSONObject兩個方法
可以將value值轉成這兩個型別
object2.getString("name");
//Leon
object2.getInt("age");
//18
object2.getJSONArray("eating");
//["rice","noodles",18]
以上兩個方法需要注意,若是沒有該key值的話,會拋出JSONException:
//System.out.println(object2.get("girlfriend"));
//System.out.println(object2.getString("girlfriend"));
//兩個皆會報org.json.JSONException: JSONObject["girlfriend"] not found.
若是使用不對的型別也會拋出JSONException:
System.out.println(object2.getString("age"));
//這裡的值18可以轉成字串
//System.out.println(object2.getBoolean("age"));
//無法轉型所以報錯:org.json.JSONException: JSONObject["age"] is not a Boolean.
(3)使用optXXX(key, default)
這個方法跟第二個方法一樣,差別在於如果取不到值的話會使用default值,例如:
object2.optString("girlfriend", "hands");
//因為object裡沒有girlfriend這個key,所以會回傳hands
(4)null值
有時候會遇到字串裡面有null值,若直接用get會報錯
所以在取值之前,可以先用isNull檢查有沒有值
Map map2 = new HashMap();
map2.put("who", "leon");
map2.put("what", "play");
map2.put("when", null);
JSONObject object5 = new JSONObject(map2);
System.out.println(object5.toString());
//{"what":"play","when":null,"who":"leon"}
//System.out.println(object5.get("when"));
//會報org.json.JSONException: JSONObject["when"] not found.
System.out.println(object5.isNull("when"));
//true
(5)取得key值&長度
可以使用names取得key值
使用length取得內容個數
System.out.println(object5.names().toString());
//["what","when","who"]
//使用object5.names()方法會取得一個JSONArray物件
System.out.println(object5.length()); //3
System.out.println(object5.names().length()); //3
//JSONObject和JSONArray都是使用length()
基本上的操作大致就這樣
另外補充,JSONObject還可以透過Map物件或JavaBean物件來建立
只要將這兩個物件建立好帶入JSONObject的建構式即可,例如:
Map:
Map map = new HashMap();
map.put("who", "leon");
map.put("what", "play");
JSONObject object3 = new JSONObject(map);
System.out.println(object3.toString());
//{"what":"play","who":"leon"}
JavaBean:
Student stu = new Student();
stu.setName("Leon");
stu.setAge(18);
JSONObject object4 = new JSONObject(stu);
System.out.println(object4.toString());
//{"name":"Leon","class":"class Student","age":18}