2015年11月14日 星期六

在Java使用org.JSON和net.sf.JSON(連結)

目前在網路上常常看到JSON of JAVA的操作,發現流行的有這兩種
.org.JSON
.net.sf.JSON
還有一種是google的,很少聽人在討論
這兩種的類別名稱很多都一模一樣,但用法不見得相同
java聽說要到JAVA9,預計2016年9月才有內建JSON,也不知是哪一種JSON

※net.sf.JSON

尤於官方網站已寫的很清楚,且英文不難,一進去就會看到型態對應和要有的jar檔
左邊Getting Started裡面有教怎麼寫,而Javadoc為API
如果是maven下載,可來這裡

※org.JSON

首先要下載,可參考我的這篇文章或者用maven下載
這裡選其中一個版本
尤於我本來是下載2015的版本,但是執行時出「java.lang.UnsupportedClassVersionError: org/json/JSONObject : Unsupported major.minor version 52.0」的錯,可能是java7或8的關係,所以只好降版了,用的是如下的版本

<dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20140107</version>
</dependency>


※JSONObject和JSONArray

// 像Map的JSONObject
JSONObject jObj = new JSONObject();
jObj.put("A", "1");
jObj.put("B", 2);
jObj.put("C", 3.3);
jObj.put("D", '4');// 不會轉為ASCII
jObj.put("E", true);
System.out.println(jObj);// {"D":52,"E":true,"A":"1","B":2,"C":3.3}
System.out.println(jObj.get("B"));// 2
    
// 像List的JSONArray
JSONArray jArray = new JSONArray();
jArray.put("F");
jArray.put(5);
jArray.put(6.6);
jArray.put('7');// ASCII為55,會轉為55
jArray.put(false);
System.out.println(jArray);// ["F",5,6.6,55,false]
System.out.println(jArray.get(3));// 55



※加入Collection

// 增加Collection
Map<String, Object> map = new HashMap<>();
map.put("AA", "1");
map.put("BB", 1);
map.put("CC", 1.1);
map.put("DD", '1');
map.put("EE", false);
    
List<Object> list = new ArrayList<>();
list.add("2");
list.add(2);
list.add(2.2);
list.add('2');
list.add(true);
    
Set<Object> set = new HashSet<>();
set.add("3");
set.add(3);
set.add(3.3);
set.add('3');
set.add(false);
    
JSONObject jObj = new JSONObject();
JSONArray jArray = new JSONArray();
    
System.out.println("JSONArray裡面放Collection");
jArray.put(map);
jArray.put(list);
jArray.put(set);
System.out.println(jArray);// [{"AA":"1","BB":1,"CC":1.1,"DD":"1","EE":false},["2",2,2.2,"2",true],["3","3",false,3,3.3]]
    
System.out.println("JSONObject裡面放Collection");
jObj.put("MapOfObj", map);
jObj.put("ListOfObj", list);
jObj.put("SetOfObj", set);
System.out.println(jObj);// {"SetOfObj":["3","3",false,3,3.3],"ListOfObj":["2",2,2.2,"2",true],"MapOfObj":{"AA":"1","BB":1,"CC":1.1,"DD":"1","EE":false}}



※JSONObject放JSONArray和JSONArray放JSONObject

JSONObject jObj = new JSONObject();
jObj.put("A", "1");
jObj.put("B", 2);
jObj.put("C", 3.3);
jObj.put("D", '4');// 不會轉為ASCII
jObj.put("E", true);
    
JSONArray jArray = new JSONArray();
jArray.put("F");
jArray.put(5);
jArray.put(6.6);
jArray.put('7');// ASCII為55,會轉為55
jArray.put(false);
    
// 以下兩組擇其一,否則會StackOverflowError(死循環)
jObj.put("ObjAll", jArray);
System.out.println(jObj);// {"D":52,"E":true,"A":"1","B":2,"C":3.3,"ObjAll":["F",5,6.6,55,false]}
System.out.println(jObj.getJSONArray("ObjAll"));// ["F",5,6.6,55,false]
    
jArray.put(jObj);
System.out.println(jArray);// ["F",5,6.6,55,false,{"D":52,"E":true,"A":"1","B":2,"C":3.3}]




※JSONObject和JSONArray的建構子

Map<String, Object> map = new HashMap<>();
map.put("AA", "1");
map.put("BB", '1');
    
List<Object> list = new ArrayList<>();
list.add("2");
list.add('2');
    
Set<Object> set = new HashSet<>();
set.add("3");
set.add('3');
    
System.out.println(new JSONObject(map));// {"AA":"1","BB":"1"}
System.out.println(new JSONObject(list));// {"empty":false}
System.out.println(new JSONObject(set));// {"empty":false}
    
// System.out.println(new JSONArray(map));
System.out.println(new JSONArray(list));// ["2","2"]
System.out.println(new JSONArray(set));// ["3","3"]
//直接塞List或Set不會轉成ASCII Code

※JSONObject類似Map,所以給list和set,不知要顯示什麼,所以會出現這個預設值

※同樣的JSONArray類似List,所以給Map,不知要顯示什麼,所以會出「org.json.JSONException: JSONArray initial value should be a string or collection or array.」的例外

沒有留言:

張貼留言