系列目錄:
-
FastJSON 基本使用
-
FastJSON 源碼閱讀
本系列持續更新
一:類基本說明
該類所屬包: com.alibaba.fastjson
該類名稱:JSONArray
該類父類:JSON
該類實現的接口:List<Object>, Cloneable, RandomAccess, Serializable
該類拋出的異常:無
首先我們能看到,這個類實現了List接口,那麼毫無疑問,他本身支持LIst的所有操作。同時我們還看見,他實現了RandomAccess接口,(這個接口用來標記該List類是可以快速隨機讀寫操作的)因此,這個List的組成形式應該是數組,而不是鏈表。同時該類支持序列化操作和克隆。
二:變量字段介紹
1:字段瀏覽
private static final long serialVersionUID = 1L;
private final List<Object> list;
protected transient Object relatedArray;
protected transient Type componentType;
2:變量解釋
- serialVersionUID = 1L; 這個在介紹JSONObject的時候就已經討論過了,是一種標誌,該標誌用來檢驗序列化是否成功
- list; 這個類其實就是JSONArray使用的內部存儲容器,用來存放數據用的數據結構,JSONArray中使用ArrayList類來進行初始化
- relatedArray;這個屬性在本類中除了控制器和訪問器以外。根本沒有使用,因此,目前不進行介紹
- componentType;這個屬性在和上面的relatedArray字段一樣,本類中沒有使用這兩個屬性。
說一下,我特意在整個工程中查找了一下這兩個變量有沒有其他的使用的地方,目前來看,我沒有找到,因此有兩種可能,這兩個變量是下一版本新特性(可能性比較小),另一種可能是 。。。。。我還沒找到
還有一個,transient這個是Java 中的關鍵字,他標記的變量不參與序列化過程
三:構造方法
1:方法瀏覽
public JSONArray(){
this.list = new ArrayList<Object>();
}
public JSONArray(List<Object> list){
this.list = list;
}
public JSONArray(int initialCapacity){
this.list = new ArrayList<Object>(initialCapacity);
}
共三種構造方法
- 默認構造方法,直接new一個ArrayList進去
- 通過傳入指定的List進行構造,JSONArray會直接維護該List作爲本實例的數據容器
- 傳入指定初始值大小,這個參數我們在HashMap裏面曾經見到過,這個數據用來指定容器更新大小的閾值
第二個構造方法中,由於直接賦值的是引用,因此,使用外部的list有可能會導致數據不安全,而且因爲默認方法用的是ArrayList,因此,該類爲非線程安全,理論上你可以傳入一個Vector來保證數據的線程問題。這個測試了,編譯器不報錯。
四:常用的普通方法
其實JSONArray的常用方法沒什麼介紹,你就把他當成List用就好了,而且呢,因爲繼承了JSON,所以有大量的操作JSON數據的方法,這裏我就不贅述了。
但是有一點值得注意,JSONArray中 和JSONObject一樣有大量的fluent方法,因此也支持鏈式操作
最後,測試JSONArray小問題的代碼
public class Day03_1 {
public static void main(String[] args) {
JSONArray jsonArray = new JSONArray();
People me = new People("我自己", 22);
jsonArray.add(me);
jsonArray.add("1");
System.out.println(jsonArray);
Studyent studyent = new Studyent();
studyent.studentName = "學生";
jsonArray.add(studyent);
System.out.println(jsonArray);
Vector vector = new Vector();
JSONArray testVector = new JSONArray(vector);
testVector.add("什麼呢");
System.out.println(testVector);
}
static class Studyent{
public String studentName;
}
}
class People{
private String peopleName;
private int peopleAge;
public People(){
this("None", 0);
}
public People(String peopleName, int peopleAge){
setPeopleName(peopleName);
setPeopleAge(peopleAge);
}
public String getPeopleName() {
return peopleName;
}
public void setPeopleName(String peopleName) {
this.peopleName = peopleName;
}
public int getPeopleAge() {
return peopleAge;
}
public void setPeopleAge(int peopleAge) {
this.peopleAge = peopleAge;
}
}
上述代碼的結果: