零 前期准备
0 FBI WARNING
文章异常啰嗦且绕弯。
1 版本
Gson 版本 : gson 2.8.5
IDE : idea 2018.3
2 Gson 简介
Gson 是谷歌开源的 java json 解析工具。市场上同类的开源产品还有 Fastjson、Jackson、json-lib等。
其实几款产品的差别都很细微,Gson 有谷歌的信仰加成,所以在这里进行一次源码分析。
3 Bean Demo
package ioc;
/**
* java bean
*/
public class Person {
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
4 main方法
import com.google.gson.Gson;
public class JsonTest {
public static void main(String[] args){
//示例 json 字符串
String json =
"{" +
" \"name\": \"zhangsan\"," +
" \"age\": 11" +
"}";
//初始化解析器
Gson gson = new Gson();
//json to bean
Person person = gson.fromJson(json,Person.class);
System.out.println(person.getName());
System.out.println(person.getAge());
//bean to json
String json2 = gson.toJson(person);
System.out.println(json2);
}
}
一 初始化 Gson 解析器
1 Gson 构造方法
该 part 的起点:
Gson gson = new Gson();
追踪 Gson 的无参构造器:
//Gson.class
public Gson() {
this(Excluder.DEFAULT, FieldNamingPolicy.IDENTITY,
Collections.>emptyMap(), DEFAULT_SERIALIZE_NULLS,
DEFAULT_COMPLEX_MAP_KEYS, DEFAULT_JSON_NON_EXECUTABLE, DEFAULT_ESCAPE_HTML,
DEFAULT_PRETTY_PRINT, DEFAULT_LENIENT, DEFAULT_SPECIALIZE_FLOAT_VALUES,
LongSerializationPolicy.DEFAULT, null, DateFormat.DEFAULT, DateFormat.DEFAULT,
Collections.emptyList(), Collections.emptyList(),
Collections.emptyList());
}
继续追踪:
//Gson.class
Gson(final Excluder excluder, final FieldNamingStrategy fieldNamingStrategy,
final Map> instanceCreators, boolean serializeNulls,
boolean complexMapKeySerialization, boolean generateNonExecutableGson, boolean htmlSafe,
boolean prettyPrinting, boolean lenient, boolean serializeSpecialFloatingPointValues,
LongSerializationPolicy longSerializationPolicy, String datePattern, int dateStyle,
int timeStyle, List builderFactories,
List builderHierarchyFactories,
List factoriesToBeAdded) {
//排除器,在序列化对象的时候会根据使用者设置的规则排除一些数据
//排除策略需要使用者自行实现 ExclusionStrategy 接口来制定
this.excluder = excluder;
//fieldNamingStrategy 负责命名规则的确定(比如 大驼峰命名、小驼峰命名、下划线命名 等)
//选择不同的 fieldNamingStrategy 会在输出 json 字符串的时候把字段名称转成不同的命名形式
//此处的值可以直接选择 FieldNamingPolicy 枚举类中的已经存储的策略,也可以自行实现 FieldNamingStrategy 接口
//此处默认为 FieldNamingPolicy.IDENTITY,即不改变
this.fieldNamingStrategy = fieldNamingStrategy;
//instanceCreators 是一个用来存储实现了 InstanceCreator 接口的对象的 map
//每一个 InstanceCreator 的实现类用来反射获取一种特定类型的 bean 对象
//InstanceCreator 在 Gson 中没有实现类,使用者可以自行定制
//此处为空 map
this.instanceCreators = instanceCreators;
//ConstructorConstructor 用来统一调度 instanceCreators
this.constructorConstructor = new ConstructorConstructor(instanceCreators);
//serializeNulls 是一个 boolean 类型的对象,用以表示是否支持空对象的序列化
//此处传入的是 DEFAULT_SERIALIZE_NULLS,值为 false,是一个定义在 Gson 中的常量
this.serializeNulls = serializeNulls;
//将 Map 序列化的过程中,会存在一个问题,即 Map 的 key 值是一个复杂对象(java bean 等)
//如果 c