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类虽然看起来方法多,但实则是在重载四类方法:
1.parse方法、parseObject方法、parseArray方法;返回结果分别为Object、JSONObject、JSONArray
2.toJSONString方法,返回JSON字符串;toJSONBytes方法,返回byte数组
3.writeJSONString方法,将JSON写进write流
4.toJavaObject方法,将JSON对象转为java实体对象
主要类的类图
fastjson工作方式的分析
调用fastjson的方式是通过JSON这个类,通过这个类中的四类方法调用各个包中的方法
主要包的分析
annotation包
该包主要定义了一些在fast中会用到的自定义的注解,注解的本质就是java接口
@JSONPOJOBuilder
指定反序列化时创建java对象使用的build方法,对应jackson的
@JsonPOJOBuilder
指定反序列化时创建java对象使用的构造方法,对应jackson的
@JSONField
指定序列化和反序列化field时的行为。
@JSONType
指定序列化和反序列化一个Java Bean时的行为。
asm包
该包主要去改变字节码文件,是一个比较底层的包,通过修改字节码文件来增加运行的速度。
parser包
该包中主要有一些反序列化的类,其中反序列化的大多数类都实现了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