源碼閱讀:FastJSON 系列 (一:FastJSON的基本使用)

系列目錄:

  1. FastJSON 基本使用

  2. FastJSON 源碼閱讀

    1. JSONObject 源碼閱讀

    2. 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(*)的方法,而是做了一些判斷。

對於這部分的源碼解析我們放到以後的系列裏

 

這個教程到此結束!

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