源码阅读:FastJSON 系列 (四 源码阅读:JSON 抽象类 源码解析-初步阅读)

Source
版权声明:转载请通知,复制请通知 如有兴趣欢迎加群:653460549 - Java资源分享 https://blog.csdn.net/qq_42038407/article/details/86763623

系列目录:

  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;
    }
}

运行截图: