关于Gson使用的一些深入研究

 分类:Android, Java 阅读 (1,219)  关于Gson使用的一些深入研究已关闭评论
7月 042019
 
一、Gson的复用

一直有一个担心,对于不同的数据类是否可以用同一个gson实例,今天研究了一下,不仅是可以,而且最好是这样使用。看代码Gson.java中的getAdapter方法,一开始就是在typeTokenCache这个缓存中找type相关的TypeAdapter。

因此复用一个gson的实例会省去匹配TypeAdapter(当然还有new Gson())的时间。

如下代码实例:

在我机器上测试不复用的话用时220-260毫秒之间(非常不稳定),复用120毫秒。

二、TypeToken是个什么东东?

TypeToken其实是为了给标识一个泛型类中的T,对于普通的类我们通过getClass().getName就可以得到类的标识,但是对于泛型类,只能得到泛型外层的类名,并不能得到泛型外层类+泛型类这样的全名。

如下代码:

输出结果是:java.util.ArrayList,而不是java.util.ArrayList<java.lang.Integer>

使用TypeToken来获取就是另外一种情况了,看下面的例子:

输出结果:

三、TypeAdapter的使用

 

四、一些类的作用

1. ConstructorConstructor – 返回一个函数可以给要操作的类新建一个实例对象。

2. InstanceCreator – 用于给没有无参数构造函数的类,创建一个实例的一个接口。解释:gson在反序列时需要创建类的一个实例,如果该类没有无参数构造函数(如:三方库中的类),则会出现异常,所以开发者需要新建一个类实现这个接口,并用该类可用的构造函数新建一个实例。并使用下面方式Gson gson = new GsonBuilder().registerTypeAdapter(Id.class, new IdInstanceCreator()).create();注册到gson中。

3. FutureTypeAdapter – 用于缓存TypeAdapter。为什么不用TypeAdapter的实例缓存?因为TypeAdapter是个虚类 :-D 

 

4月 032018
 

  对于简单的key:value的json数据,我们把所有的key定义为类成员,然后gson.fromJson即可序列化为java对象。

  对于复杂的json数据,里面既有普通的key:value数据,也有二级的列表的数据,我们该如何处理呢?

  事实上,非常的简单,我们在该类里再定义一个内部类,和一个List组织该内部类的对象即可,比如下面的json数据:

  那么我们定义的解析类如下:

  解析的时候使用如下代码即可:

  是不是非常的简单!

10月 272016
 

使用gson进行数据解析后,必须在混淆脚本中添加如下代码,如果不加的话json解析就会失败。

其中-keep class com.bcoder.test.datatypes.** { *; }这一行class和.**之间改成你的Bean类所在的包名