系列目錄:
-
FastJSON 基本使用
-
FastJSON 源碼閱讀
本系列持續更新
一:類基本說明
該類所屬包:com.alibaba.fastjson;
該類名稱:JSON
該類父類:Object(超類)
該類實現的接口:JSONStreamAware,JSONAware
該類拋出的異常:無
首先這個類,我們目前知道的已知繼承類有JSONObject 和 JSONArray,但是我今天閱讀的時候,有一個很重要的問題弄了好久,那就是,這個類爲什麼是那兩個類的父類呢?因爲最開始我看見了不少的例如:getString(),getByte()等需要類型轉換的方法,因此我以爲是爲了父類中有寫,但是讀了一邊之後,我並沒有發現這種操作,通過鎖定,類似於類型轉換的方法:castToInteger()等方法是存在於TypeUtil類裏的,因此這個父類到底幹了什麼,讓兩個主要類都繼承與他。
要想搞明白,我們就得設想一下,在什麼情況下我們會用繼承抽象類的方式設計類結構。首先,其他文件調用子類而且避免多態,則會讓及各類繼承一個父類,類似於策略模式,生成一個類,由參數指定,類似工廠模式等。總之這樣寫一定是爲了類結構的清晰和使用簡便而存在,因此子類一定有相似的地方。不管怎樣 讀一遍就會有答案。如果沒有,再讀一遍。
按照我自己的閱讀流程
二:變量字段介紹
public static TimeZone defaultTimeZone = TimeZone.getDefault();
public static Locale defaultLocale = Locale.getDefault();
public static String DEFAULT_TYPE_KEY = "@type";
static final SerializeFilter[] emptyFilters = new SerializeFilter[0];
public static String DEFFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
public static int DEFAULT_PARSER_FEATURE;
public static int DEFAULT_GENERATE_FEATURE;
- defaultTimeZone:默認時區通過JVM虛擬機傳入
- defaultLocale:這個類 以前說實話 沒見過,這個類在java.util下,注意是Locale,代表着地區,地理地區的地區
- default_type_key:默認鍵值,這個東西和內部保持引用保持唯一有關係,這個東西,後面會深入研究(之前出現過$[0].people, 在使用的時候,那裏與這個東西有點關係)
- emptyFilters: 序列化攔截,用來自定義序列化的
- DEFALT_DATE_FORMAT : 默認時間格式
- DEFAULT_PARSER_FEATURE:這個我並不是特別確定,看樣子應該是當前版本中JDK的某些可被使用的方法是否支持,這個東西有點詭異,用的是位操作表示的,當時看了好久纔想起來Java中有位操作。。。。。。
- DEFAUTL_GENERATE_FEATURE:和上面的功能類似
在這裏我們可以看到,Fast JSON並不是簡簡單單的操作JSON,而是對於大部分有可能使用JSON的渠道都做了支持,而且看起來支持很好。
而且在進行測試的時候,我發現了一個問題,有一種情況,JSONObject或者JSONArray中不保存JSON格式的數據,而是將其轉換爲了一個字符串,經過反覆測試才發現,當且僅當本JSON數據中含有同樣的該數據則將其變爲指向第一次出現的JSON數據的引用。
這裏我們可以知道,JSONObject和JSONArray中一定是用了代理模式,因爲當數據被存儲的使用,並不是簡單的調用了add(),put()等方法,而是將其轉換爲JSON格式數據後才進行存入,所以一定有代理,但是我還沒有找到。。。。。
二:JSON沒有特定的構造方法
三:方法一覽:
首先說一下,這裏不放方法聲明瞭,因爲在JSON中幾乎所有的方法都是parse....,to.....,等,也就是說,JSON中幾乎所有的方法都是爲了數據轉換而存在的,並沒有什麼特定的方法,因此,我沒有放聲明。
在這裏,我發現了一個問題,幾乎所有的方法都是static修飾的,也就是說,這個類沒有爲子類提供任何幫助。。。。。
在JSONObject和JSONArray中,由於繼承了他,文檔上又說這個類是最主要的類來處理格式關係,因此,我們有理由相信,這樣做的原因是封裝了一些常用的方法,共開發者的調用。而且避免了造同樣的輪子。
這裏說一下我的問題,我現在還不是很瞭解序列化技術,因此,這裏大量的序列化代碼我無法閱讀,因此要補一補序列化的知識了。
最後我的測試代碼(大家除夕快樂,新年快樂23333333333)
話說因爲我的腦子不太好使,這個類我硬生生地看了6個小時纔看明白大致怎麼回事,這兩天過年被家人逼着吃飯。。做了好久火車,吼累哦。
public class Day04_1 {
public static void main(String[] args) {
People people = new People();
people.peopleName = "測試";
JSONObject jsonObject = new JSONObject();
jsonObject.put("測試默認用例", "測試默認");
jsonObject.put("people",people);
jsonObject.put("people2", people);
JSONArray jsonArray = new JSONArray();
jsonArray.add(new JSONObject());
jsonArray.add(jsonObject);
jsonArray.add(people);
System.out.println(jsonObject);
System.out.println(jsonArray);
}
static class People{
public String peopleName;
}
}
運行截圖: