做网络请求的时候肯定要封装回调,我这里就传了泛型,但是出了个问题是Gson没办法直接解析泛型,如果直接解析的话,不会得到一个javabean而是得到一个LinkedTreeMap。
然后我去网上找了很就,都没有直接能把LinkedTreeMap转成javabean的方法,但是我们不可能给每个请求的结果都单独去写一个解析,这时候我们就不得不去正面一个问题:如何使用Gson来解析泛型
而我这篇文章都会去围绕这个问题去讲,表面上讲gson,实际上是讲java的type
因为是分2天写的,前面有点乱,可以直接看总结
一.使用Gson来解析JSON
我们先看看平时如何使用Gson来解析json,就假设有个Test类吧。
Test test = gson.fromJson(json, Test.class);
一般在明确对象类型之后我们确实可以这样做,但是如果是泛型呢
T test = gson.fromJson(json, T.class);
肯定不能这样玩,这不符合泛型的思想,而且也没有T.class,所以需要换种方法来做
这个方法的第二个参数是传一个Type,我们可以来看看什么是Type
都知道能理解成是一个类型的接口,但是从include这句话可以更加清楚的知道他是一个什么意思。
二.获取Type
一般你可以很容易的找到这样做
Type type = new TypeToken() {}.getType();
JsonBean jsonBean = gson.fromJson(json, type);
然后你觉得如果解析泛型的话可以这样
Type type = new TypeToken() {}.getType();
JsonBean jsonBean = gson.fromJson(json, type);
这个我没试过,但是我知道如果传的不是泛型,而是一个包含泛型的类,最后解析出来的还是LinkedTreeMap,比如这样
Type type = new TypeToken>() {}.getType();
JsonBean jsonBean = gson.fromJson(json, type);
因为一般网络请求的数据结构我们都会这样做Result,而这样是没法正常解析出我们想要的对象的。
这个时候网上就有一篇文章写得特别好
https://www.jianshu.com/p/d62c2be60617
可以看到需要重写一个类继承ParameterizedType
public class ParameterizedTypeImpl implements ParameterizedType {
private final Class ra