Gson解析原理概述
来源:互联网 发布:韩国作曲家甘雨知乎 编辑:程序博客网 时间:2024/05/23 14:13
通过前几篇的关于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以及反射解析的具体,请参考之前写的博客
0 1
- Gson解析原理概述
- Gson解析原理概述
- json概述和gson解析
- Gson原理
- Gson解析
- GSON解析
- Gson解析
- Gson解析
- Gson解析
- Gson解析
- GSON解析
- Gson解析
- Gson解析
- Gson解析
- Gson解析
- Gson 解析
- gson解析
- Gson解析
- HDU3584 Cube
- 栈的基本操作(顺序表)
- iOS JSON的选项NSJSONReadingMutableLeaves
- Codeforces 2015-2016 ACM-ICPC, NEERC, Southern Subregional Contest I题(模拟)
- 为经典版eclipse增加web and JavaEE插件
- Gson解析原理概述
- 一看就会Android之SQLite中事务的使用
- 浅谈计算机中的存储模型-(虚拟存储)
- Noip2013火柴排队题解
- LeetCode 089 Gray Code
- Makefile
- Libev源码分析02:Libev中的IO监视器
- HIHO Drinking Game
- UML之用例图