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