系列目錄:
-
FastJSON 基本使用
-
FastJSON 源碼閱讀
-
JSONObject 源碼閱讀
-
JSONArray 源碼閱讀
-
FastJSON介紹:
一:官方定義:
不得不說, 大廠就是大廠,氣勢都和別人不一樣,官方介紹中有這樣的一句話:
看看這氣場,從未被超越,不過確實,我賊喜歡這個庫,用起來賊簡單
fastjson是阿里巴巴的開源JSON解析庫,它可以解析JSON格式的字符串,支持將Java Bean序列化爲JSON字符串,也可以從JSON字符串反序列化到JavaBean。
所以我們知道,這個庫的持有者是阿里巴巴。
二:基本使用技巧
1:我們先來介紹對於JSONObject 的使用
定義方式:最爲常用的兩種方法
JSONObject jsonObject1 = new JSONObject();
Map map = new HashMap<>();
JSONObject jsonObject2 = new JSONObject(map);
這裏有一個小坑,當你使用Map構造的時候,源代碼中構造方式爲
也就是說你穿進去的值後,他沒有複製,而是使用索引,因此,如果這個map發生改變後,JSONObject內的數據跟者改變!
還有其他的複製方法,你可以指定用LinkedHashMap還是HashMap,只需要傳入一個boolean值即可,如果爲真,則使用LinkedHashMap, 否則使用HashMap, FastJson中默認使用HashMap作爲數據存儲的容器。
JSONObject的常用操作和HashMap基本一樣,如下:
//聲明一個基本的JSON對象
JSON QObject jsonObject = new JSONObject();
//存放連個數據,姓名和年齡
jsonObject.put("name", "趙本山");
jsonObject.put("age", 15);
//打印一下
System.out.println(jsonObject);
但是如果傳入的是一個非基本類的話,對於map會把類本身放入容器,但是對於JSONObject不一樣,他會把這個類解析成JSONObject對象再放進去,如下:
//那如果存入一個人類呢,看看行不行
JSONObject peopleJSON = new JSONObject();
People people = new People();
people.peopleAge = 15;
people.peopleName = "趙四";
peopleJSON.put("people", people);
System.out.println(peopleJSON);
static class People{
public String peopleName;
public int peopleAge;
}
輸出的結果是:
這裏面還有一個小小的問題,問題就是如果被傳入的類中字段爲public則,JSON解析該對象的時候,會把public字段添加至JSON對象,如果不是public,則需要添加控制器和訪問器,如果既不是public也沒有可控制器和訪問器的話,該字段不會被添加,而且被加入的類對轉換成一個JSON對象。
對於JSONObject的對象遍歷鍵值對的時候,可以用map的傳統方式進行遍歷取值,例如:
for(String keyName : jsonObject.keySet()){
System.out.println(keyName + ":" + jsonObject.get(keyName));
}
二:JSONArray的使用:
JSONArray實現了List接口,因此使用方式與List的方式相同,包括遍歷,添加數據,刪除數據,.size()方法等
同時我們還發現JSONArray可以利用List直接創建,創建的過程很簡單,直接引用索引,因此如果使用List構造的時候,List變化會影響到JSONArray的數據變化。
因爲JSONArray是一個list,因此我再添加數據的時候,測試了一下直接傳入一個類,發現可以是可以,但是對於結果,有些奇怪
JSONArray jsonArray = new JSONArray();
jsonArray.add(peopleJSON);
jsonArray.add(jsonObject);
System.out.println(jsonArray);
jsonArray.add(people);
System.out.println(jsonArray);
for(Object object : jsonArray){
System.out.println(object);
}
輸出的結果超出了最後放進去的people類以外,其他很正常,對於people類,他保存成了:{"$ref":"$[0].people"}
對於遍歷結果也是一樣:
因此使用JSONArray的時候,因爲這時候還沒有深入理解JSONArray添加數據的方法,因此,暫時避免用JSONArray來存放非JOSNObject數據。
然後我們來看一下JSONArray中構造器的源碼:
可以看出來,JSONArray使用的是ArrayList來存放數據,欸,一開始我以爲實現了List接口後,他自己做的一個List,沒想到用的是ArrayList.
JSONArray 本身提供大量的數據操控方法:
因此,對於數據定製有很大的幫助,
這裏面對於添加和刪除,有很多並不是簡單的調用list.add(*)的方法,而是做了一些判斷。
對於這部分的源碼解析我們放到以後的系列裏
這個教程到此結束!