JAVA解析JSON常用方法及注意事項

JSON:JavaScript 對象表示法(JavaScript Object Notation)。

分享一個: 在線的json解析器
再分享一個: w3c json教程地址


json支持的數據類型:
   - Number  數字型(整數或浮點數)
   - String   字符串型(在雙引號中)
   - Boolean  布爾型(true 或 false)
   - Object   對象(在花括號中,元素之間以逗號分隔) {“name”:”adf”,”age”:”123”}
   - Array    數組 (在方括號中,元素之間以逗號分隔) [“1”,”2”,”3”]
   - null    空值
  
  ps:Object表示對象,類似於C語言中的結構體,以花括號”{}”括起來,其元素要求爲鍵值對,key必須爲String類型的,而value則可爲任意類型。key和value之間以” : “表示映射關係。


市面上最常見的三種解析json的方式

    <!-- 普通 json  jar包 -->
    <!-- https://mvnrepository.com/artifact/org.json/json -->
    <dependency>
      <groupId>org.json</groupId>
      <artifactId>json</artifactId>
      <version>20160810</version>
    </dependency>
    <!-- 阿里 fastjson jar包 -->
    <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>1.2.47</version>
    </dependency>
    <!-- 谷歌 gjson jar包 -->
    <!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
    <dependency>
      <groupId>com.google.code.gson</groupId>
      <artifactId>gson</artifactId>
      <version>2.8.2</version>
    </dependency>

關於 org.json

// -------JSONObject 初始化 -------
//方式一:
JSONObject obj = new JSONObject();
obj.put("name", "John");
obj.put("sex", "16");
//方式二:
Student stu = new Student();
stu.setAge("123");
stu.setName("adf");
JSONObject json = new JSONObject(stu);
//方式三:
Map<String,String> map = new HashMap<String ,String>();
map.put("a","1");
map.put("b","2");
JSONObject jsonMap = new JSONObject(map);
System.out.println(jsonMap);
//方式四:
String str = "{'name':'adf','age':'123'}";
JSONObject jsonStr = new JSONObject(str);
System.out.println(jsonStr);


//------- 一些簡單常用的方法 -------

//put 和 accumulate
JSONObject obj = new JSONObject();
obj.put("name", "John");
obj.accumulate("sex","11");
System.out.println(obj);

obj.accumulate("sex","22");
obj.put("name", "Aili");
System.out.println(obj);
//輸出結果
//{"sex":"11","name":"John"}
//{"sex":["11","22"],"name":"Aili"}
//put會取代舊值,accumulate會在舊值的基礎上將value追加成數組

//append
//在值爲數組的基礎上追加,value類型不是數組會報錯
obj.append("sex","33");

//optString 和 getString
//當key不存在時,optString會返回一個空字符串或者返回你指定的默認值,getString會報JSONException異常:org.json.JSONException: JSONObject["xxx"] not found.
JSONObject json = new JSONObject();
String str=json.optString (key);  //key不存在會返回null。
String str=json.optString (key,fallback);  //key不存在會返回指定默認值fallback。
//看到方法的返回值想必就理解怎麼使用了吧,getString這個方法獲取key對應的value值時必須保證value是String類型的否則報錯
Object age = json.get("age");
String age1 = json.getString("age");
String age2 = json.optString("age");
Object age3 = json.opt("age");

//toJSONArray 
//如果你想將JSONObject所有或者指定value轉換成JSONArray,這個方法再合適不過了
//新建JSONArray,JSONArray裏的值對應JSONObject的key即可,對應不上的會添加null
JSONObject obj = new JSONObject();
obj.put("name", "John");
obj.accumulate("sex","11");
System.out.println(obj);

JSONArray arr = new JSONArray();
arr.put("name");
arr.put("sex");
JSONArray objects = obj.toJSONArray(arr);
System.out.println(objects);

//getJSONArray 和 getJSONObject
//使用的前提對應value的類型要對應上
//如果只是簡單的獲取值建議用上邊提到的get和opt系列即可,獲取值後要進一步對JSONArray和JSONObject操作才建議使用這兩個方法,畢竟達到的效果是一樣的
JSONArray jsonArray = obj.getJSONArray("hobbies");
JSONObject jsonObject = obj.getJSONObject("stu");

關於 fastjson

//------- 初始化 -------
//方式一:
JSONObject obj = new JSONObject();
obj.put("name", "John");
obj.put("sex", "John");
System.out.println(obj);
//方式二:默認爲false內部維護HashMap,當爲true時維護LinkedHashMap,輸出時按put順序輸出
JSONObject objOrder = new JSONObject(true);
objOrder.put("name", "John");
objOrder.put("sex", "16");
System.out.println(objOrder);
//方式三:因爲內部維護的是Map,所以初始化不能直接使用對象
Map<String,Object> map = new HashMap<String ,Object>();
map.put("a","1");
map.put("b","2");
JSONObject jsonMap = new JSONObject(map);
System.out.println(jsonMap);
//方式四:
String str = "{'username':'John','password':'123'}";
JSONObject json = JSONObject.parseObject(str);
System.out.println(json);


//------- 一些簡單常用的方法 -------
//因爲內部維護的是Map所以一些方法的使用和操作Map會比較像

//get
//key存在則返回對應值,不存在返回空
JSONObject obj = new JSONObject();
obj.put("name", "John");
Object name = obj.get("name");
Object age = obj.get("age");
System.out.println(name);
System.out.println(age);

//getJSONArray 和 getJSONObject 
//和之前提到的一樣,value類型不對會報語法錯:syntax error
JSONArray jsonArray = obj.getJSONArray("name");
JSONObject jsonObject = obj.getJSONObject("name");

//get:允許key不是String類型,查不到返回null
//getString:key必須爲String類型,查不到返回null
//getObject:第二個參數可選,意思爲將查出來的value進行類型轉換,查不到返回null
Object sex = obj.get(12);
String string = obj.getString("name");
Double sex1 = obj.getObject("sex", Double.class);

//put:一次加一個,存在則返回舊值,取代舊值添加,不存在就返回null,添加
//putIfAbsent:存在則返回舊值,不添加,不存在就返回null,添加
//putAll:一次允許加多個
JSONObject obj = new JSONObject();
obj.put("name","Json");
Object o1 = obj.putIfAbsent("name", "Tom");
Map<String,Object > map = new HashMap<String,Object>();
map.put("1","1");
map.put("2","2");
obj.putAll(map);

//fluentPut 和 fluentPutAll 
//從源碼中看和上邊提到的 put 和 putAll 沒什麼區別只是方法返回值不同
JSONObject jsonObject = obj.fluentPut("zxc", "zxc");
System.out.println(obj);
HashMap map = new HashMap<String,Object>();
map.put("1","1");
map.put("2","2");
JSONObject jsonObject2 = obj.fluentPutAll(map);

關於 gjson

//------- 初始化 -------

//方式一:只有一個無參構造方法
JsonObject json = new JsonObject();
json.addProperty("name", "John");
json.addProperty("sex", "John");
System.out.println(obj);

//------- 一些簡單常用的方法 -------
//內部維護:LinkedTreeMap 所以會有一些節點的概念

//addProperty 
//添加值
JsonObject json = new JsonObject();
json.addProperty("name","John");

//get 
//獲取值,返回對象是JsonElement 
JsonElement qwe = json.get("name");
System.out.println(qwe);

今天就到這裏了,有哪些地方沒有寫到的或者有錯誤和疑問的歡迎下方留言,會在看到消息第一時間答覆,謝謝

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章