fastjson源码分析1-综述

2021SC@SDUSC

综合分析

1.fastjson的简单介绍

Fastjson 是一个 Java 库,可以将 Java 对象转换为 JSON 格式,当然它也可以将 JSON 字符串转换为 Java 对象。

Fastjson 可以操作任何 Java 对象,即使是一些预先存在的没有源码的对象。

Fastjson 源码地址:https://github.com/alibaba/fastjson

Fastjson 中文 Wiki:https://github.com/alibaba/fastjson/wiki/Quick-Start-CN

2.简单使用

(1)将java对象转换为json格式

首先建立一个User类

public class User {
    private String userName;
    private String age;

    public User(String userName,String age){
        this.userName = userName;
        this.age = age;
    }
}

用toJSONString()方法将java对象转换为json对象字符串

User user = new User("ck","123");
        String s = toJSONString(user);
        System.out.println(s);

输出:

{"age":"123","userName":"ck"}

将json字符串转换为JSONObject对象

JSONObject jsonObject = parseObject(s);
        System.out.println(jsonObject);
(2)将json对象转回为java对象

只需使用toJavaObject方法即可

User user1 = JSON.toJavaObject(jsonObject, User.class);
        System.out.println(user1.getUserName());

输出:

ck

3.源代码主要结构

fastjson的项目是用java完成的

源码结构

源码结构
源码的入口类是JSON类,外界调用也是通过这个类的方法去调用。

JSON类

项目的入口类为JSON,该类有非常多的方法,如图(部分方法):
JSON类
JSON类虽然看起来方法多,但实则是在重载四类方法:
1.parse方法、parseObject方法、parseArray方法;返回结果分别为Object、JSONObject、JSONArray
2.toJSONString方法,返回JSON字符串;toJSONBytes方法,返回byte数组
3.writeJSONString方法,将JSON写进write流
4.toJavaObject方法,将JSON对象转为java实体对象

主要类的类图

主要类的类图

fastjson工作方式的分析

调用fastjson的方式是通过JSON这个类,通过这个类中的四类方法调用各个包中的方法

主要包的分析

annotation包

annotation
该包主要定义了一些在fast中会用到的自定义的注解,注解的本质就是java接口
@JSONPOJOBuilder
指定反序列化时创建java对象使用的build方法,对应jackson的

@JsonPOJOBuilder
指定反序列化时创建java对象使用的构造方法,对应jackson的

@JSONField
指定序列化和反序列化field时的行为。

@JSONType
指定序列化和反序列化一个Java Bean时的行为。

asm包

asm
该包主要去改变字节码文件,是一个比较底层的包,通过修改字节码文件来增加运行的速度。

parser包

parse
该包中主要有一些反序列化的类,其中反序列化的大多数类都实现了ObjectDeserializer这个接口;

serializer包

在这里插入图片描述
这个类中的包大都实现了ObjectSerializer,用于把对象序列化

主要类的分析

JSONObject

JSONObject实现了Map接口,而json对象中的数据都是以"键:值"对形式出现,可以猜想,JSONObject底层操作是由Map实现的。

JSONObject实际是一个Map<String, Object>

类中主要是get()方法。因为JSONObject相当于json对象,所以该类中主要封装了各种get方法,通过"键:值"对中的键来获取其对应的值。且方法的输入参数几乎皆为String类型,这是因为json对象中,"键:值"对的键都是String类型的。来看一下平时用到较多的 。

在这里插入图片描述
JSONObject对应json对象,通过各种形式的get()方法可以获取json对象中的数据,也可利用诸如size(),isEmpty()等方法获取"键:值"对的个数和判断是否为空。其本质是通过实现Map接口并调用接口中的方法完成的

JSONArray

该类继承了List,其内部主要方法是由List的方法来完成操作的。

JSONArray实际是一个List

JSONArray代表json对象数组,json数组对象中存储的是一个个json对象,所以类中的方法主要用于直接操作json对象。比如这其中的add(),remove(),containsAll()方法,对应于json对象的添加,删除与判断。其内部主要有List接口中的对应方法来实现。

JSON

该类主要用于实现转化,转化后的数据获取类型通常是上面的JSONArray和JSONObject

小组分工情况

由于调用整个fastjson的方法都是通过JSON类去实现的,所以我们的分工也是从JSON类去出发,通过JSON类的方法,去层层深入源码分析。

我们根据JSON类提供的服务,将其工作大体上分为了两类,一类是序列化方法parse、parseObject和parseArray;另一类是反序列化方法toJSONString、toJSONBytes和writeJSONString,根据这些方法调用的类再去深入分析源码;
初步决定我负责的分析的部分是toJSONString和toJSONBytes

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值