Gson源码解析

本文从Json格式介绍开始,详细解析Gson库的使用和源码。通过构建Gson对象,探讨Json转换成Java Bean的过程,包括TypeAdapter的作用、类型构造函数的选择、BoundField的创建和字段的序列化与反序列化。文章揭示了Gson如何逐字符解析Json,解释了private字段的可解析性以及类型自动转换机制。
摘要由CSDN通过智能技术生成

按照一般的套路,源码的解析都是从使用开始,这一篇也不出所料,我们从简单的使用开始讲解本篇文章,但是还是不得不提一个小插曲,就是所谓的Json格式,先熟悉了Json格式才能很好的理解Json的转换
一,Json的格式
JSON 语法是 JavaScript 对象表示法语法的子集。

数据在名称/值对中
数据由逗号分隔
花括号保存对象
方括号保存数组

JSON 名称/值对

"firstName" : "John"
“intType”:3
"integerMap":["1":1,"2":2]
"booleanValue":true

JSON对象

{ "firstName":"John" , "lastName":"Doe" }

JSON数组

{
	"employees": [
		{ "firstName":"John" , "lastName":"Doe" },
		{ "firstName":"Anna" , "lastName":"Smith" },
		{ "firstName":"Peter" , "lastName":"Jones" }
	]
}

二,Gson的基本使用,我们先构建一个Gson的对象,然后调用对象的方法来把对象转化成Json,或者把Json转成对象。

private void testGson() {
String s = gson.toJson(new TestBean());    Gson gson = new Gson();
    String s = gson.toJson(new TestBean());
    TestBean testBean = gson.fromJson(s, TestBean.class);
}

三,源代码解析

1,构建Gson的对象,他会在里面调用另一个构造函数,里面会带框架的默认值,

Gson gson = new Gson();

2,Gson的另一个构造函数,里面为矿机初始化的默认值

this(Excluder.DEFAULT, FieldNamingPolicy.IDENTITY,
    Collections.<Type, InstanceCreator<?>>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, Collections.<TypeAdapterFactory>emptyList());

3,Gson里面会初始化出一系列的TypeAdapter,他就是后面需要用来解析不同字段的不同的对象

Gson(final Excluder excluder, final FieldNamingStrategy fieldNamingStrategy,
    final Map<Type, InstanceCreator<?>> instanceCreators, boolean serializeNulls,
    boolean complexMapKeySerialization, boolean generateNonExecutableGson, boolean htmlSafe,
    boolean prettyPrinting, boolean lenient, boolean serializeSpecialFloatingPointValues,
    LongSerializationPolicy longSerializationPolicy,
    List<TypeAdapterFactory> typeAdapterFactories) {
  this.constructorConstructor = new ConstructorConstructor(instanceCreators);
  this.excluder = excluder;
  this.fieldNamingStrategy = fieldNamingStrategy;
  this.serializeNulls = serializeNulls;
  this.generateNonExecutableJson = generateNonExecutableGson;
  this.htmlSafe = htmlSafe;
  this.prettyPrinting = prettyPrinting;
  this.lenient = lenient;

  List<TypeAdapterFactory> factories = new ArrayList<TypeAdapterFactory>();

  // built-in type adapters that cannot be overridden
  factories.add(TypeAdapters.JSON_ELEMENT_FACTORY);
  factories.add(ObjectTypeAdapter.FACTORY);

  // the excluder must precede all adapters that handle user-defined types
  factories.add(excluder);

  // user's type adapters
  factories.addAll(typeAdapterFactories);

  // type adapters for basic platform types
  factories.add(TypeAdapters.STRING_FACTORY);
  factories.add(TypeAdapters.INTEGER_FACTORY);
  factories.add(TypeAdapters.BOOLEAN_FACTORY);
  factories.add(TypeAdapters.BYTE_FACTORY);
  factories.add(TypeAdapters.SHORT_FACTORY);
  TypeAdapter<Number> longAdapter = longAdapter(longSerializationPolicy);
  factories.add(TypeAdapters.newFactory(long.class, Long.class, longAdapter));
  factories.add(TypeAdapters.newFactory(double.class, Double.class,
          doubleAdapter(serializeSpecialFloatingPointValues)));
  factories.add(TypeAdapters.newFa
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值