操作JSON格式的資料(Java)

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}