源碼閱讀:FastJSON 系列 (四 源碼閱讀:JSON 抽象類 源碼解析-初步閱讀)

系列目錄:

  1. FastJSON 基本使用

  2. FastJSON 源碼閱讀

    1. JSONObject 源碼閱讀

    2. JSONArray   源碼閱讀

    3.  

本系列持續更新

一:類基本說明

該類所屬包: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;
  1. defaultTimeZone:默認時區通過JVM虛擬機傳入
  2. defaultLocale:這個類 以前說實話 沒見過,這個類在java.util下,注意是Locale,代表着地區,地理地區的地區
  3. default_type_key:默認鍵值,這個東西和內部保持引用保持唯一有關係,這個東西,後面會深入研究(之前出現過$[0].people, 在使用的時候,那裏與這個東西有點關係)
  4. emptyFilters: 序列化攔截,用來自定義序列化的
  5. DEFALT_DATE_FORMAT : 默認時間格式
  6. DEFAULT_PARSER_FEATURE:這個我並不是特別確定,看樣子應該是當前版本中JDK的某些可被使用的方法是否支持,這個東西有點詭異,用的是位操作表示的,當時看了好久纔想起來Java中有位操作。。。。。。
  7. 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;
    }
}

運行截圖:

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