Gson解析原理概述
原理 解析 概述 Gson
2023-09-11 14:19:04 时间
通过前几篇的关于Gson的博客我们知道Gson的解析原理:
1)如果是通过GsonBuilder创建的Gson对象,那么就用自定义的TyperAdapter来完成json的解析
2)如果是通过new Gson()创建的Gson对象,那么就用Java反射机制来完成json的解析。
那么Gson在是怎么判断是上述两种方式的哪一种呢?查看Gson源码,并没有提供一个特殊的字段来辨别?
其实很简单,通过Gson的factories(List) 这个对象add TypeAdapterFactory的顺序来控制的!当是用第一种方式来创建Gson对象的时候,把自定一个TypeAdapter或者TypeAdapterFactory添加在factories靠前的位置,然后在getAdapter方法中遍历factories的每一个TypeAdapterFactory,如果当前循环中的TypeAdapterFactory.create 返回的TypeAdapter!=null,就返回该Adapter退出了factories的遍历.因为自定义的TypeAdapter位置在factories中靠前这样就优先与ReflectiveTypeAdapterFactory 遍历到,所以就避免了用Gson的反射机制来解析json了。
Gson的有参构造器中的代码有如下添加TypeAdapterFactory的方法:
// user's type adapters
//优先添加自定义的TypeAdapter
factories.addAll(typeAdapterFactories);
// type adapters for basic platform types
//添加Gson自带的TypeAdapterFactory
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);
factories.add(TypeAdapters.newFactory(long.class, Long.class,
longAdapter(longSerializationPolicy)));
factories.add(TypeAdapters.newFactory(double.class, Double.class,
doubleAdapter(serializeSpecialFloatingPointValues)));
factories.add(TypeAdapters.newFactory(float.class, Float.class,
floatAdapter(serializeSpecialFloatingPointValues)));
factories.add(TypeAdapters.NUMBER_FACTORY);
factories.add(TypeAdapters.CHARACTER_FACTORY);
factories.add(TypeAdapters.STRING_BUILDER_FACTORY);
factories.add(TypeAdapters.STRING_BUFFER_FACTORY);
factories.add(TypeAdapters.newFactory(BigDecimal.class, TypeAdapters.BIG_DECIMAL));
factories.add(TypeAdapters.newFactory(BigInteger.class, TypeAdapters.BIG_INTEGER));
factories.add(TypeAdapters.URL_FACTORY);
factories.add(TypeAdapters.URI_FACTORY);
factories.add(TypeAdapters.UUID_FACTORY);
factories.add(TypeAdapters.LOCALE_FACTORY);
factories.add(TypeAdapters.INET_ADDRESS_FACTORY);
factories.add(TypeAdapters.BIT_SET_FACTORY);
factories.add(DateTypeAdapter.FACTORY);
factories.add(TypeAdapters.CALENDAR_FACTORY);
factories.add(TimeTypeAdapter.FACTORY);
factories.add(SqlDateTypeAdapter.FACTORY);
factories.add(TypeAdapters.TIMESTAMP_FACTORY);
factories.add(ArrayTypeAdapter.FACTORY);
factories.add(TypeAdapters.ENUM_FACTORY);
factories.add(TypeAdapters.CLASS_FACTORY);
// type adapters for composite and user-defined types
//到最后才把反射机制用的Factory添加到factories中
factories.add(new CollectionTypeAdapterFactory(constructorConstructor));
factories.add(new MapTypeAdapterFactory(constructorConstructor, complexMapKeySerialization));
factories.add(new ReflectiveTypeAdapterFactory(
constructorConstructor, fieldNamingPolicy, excluder));
this.factories = Collections.unmodifiableList(factories);
getAAdpater遍历factories的代码如下:
for (TypeAdapterFactory factory : factories) {
TypeAdapter<T> candidate = factory.create(this, type);
/**
如果是自定义的TypeAdapter就优先返回,否则就返回了
*ReflectiveTypeAdapterFactory
**/
if (candidate != null) {
call.setDelegate(candidate);
typeTokenCache.put(type, candidate);
return candidate;
}
}
因此Gson的整体解析原理可以用如下图来概述:
至于Gson的typeAdapter以及反射解析的具体,请参考之前写的博客
相关文章
- git分支原理命令图文解析
- 【生活现场】从打牌到map-reduce工作原理解析(转)
- Python中的浮点数原理与运算分析
- Apollo配置发布原理
- UDP"打洞"原理
- SAP UI5 应用 index.html 里引导 script 属性的解析原理
- SAP OData batch request的并行处理实现原理
- webpack最简单的入门教程里bundle.js之运行单步调试的原理解析
- Atitit 表达式原理 语法分析 原理与实践 解析java的dsl 递归下降是现阶段主流的语法分析方法
- Atitit 《控制论原理与概论attilax总结
- 【nodejs原理&源码杂记(8)】Timer模块与基于二叉堆的定时器
- View的滚动原理简单解析(二)
- ThreadLocal原理浅析
- 【人工智能:Open AI】聊天GPT 背后的实现原理是怎样的?用不少于1000字的图文并茂的介绍告诉我
- 【BAT 面试题宝库附详尽答案解析】分布式事务实现原理
- Kotlin Coroutines 协程实现原理全解析
- 数据库系统原理(一)——数据库系统基本概念
- Heap Spray原理浅析——todo,待实践
- sql报错注入:extractvalue、updatexml报错原理
- JSONP原理及实现跨域方式
- (01)ORB-SLAM2源码无死角解析-(39) EPnP 算法原理详解→理论基础三:高斯牛顿迭代
- 【Netty】Netty原理架构解析
- Kubernetes 架构核心组件工作原理解析