android retrifit2 返回体封装,Gson泛型解析的封装

本文参考:

https://www.jianshu.com/p/4f797b1f8011
https://www.jianshu.com/p/d62c2be60617

需求:

调试接口的时候,接口返回的result字段对应的可能是bean 也可能是list, 而项目里用的是单ApiServer,所以返回Observable, 通过ResponseBody.string()获取返回的内容,不过是String类型的,但是总不能在每个返回的onNext里面都去根据当前返回的参数去解析成对应的bean吧?需要解析成我们想要的bean或list,而一般我们的Observer都会自定义一个传入一个泛型,如下:

public abstract class ResponseObserver<T> implements Observer<ResponseBody> {

    @Override
    public void onNext(ResponseBody responseBody) {
        String str = responseBody.string();
        //这里需要把 str解析为我们想要的T,并通过调用onSuccess(T t)把结果传出去
    }

    public abstract void onSuccess(T t);
}

平时使用Gson来解析json使用如下:

Test  test  = gson.fromJson(json, Test.class);

一般在明确对象类型之后我们确实可以这样做,但是如果是泛型呢

T test  = gson.fromJson(json, T.class);

当然,这样写肯定是不行的,这不符合泛型的思想,而且也没有T.class,所以需要换个方法去写,先看看gson的fromJson方法:

在这里插入图片描述
既然第一个方法行不通,则试试后面的方法,emmm…也就第二个了,传Type?Type是何物?,ctrl点击进去看看:
在这里插入图片描述
Type的用法,我们在使用Gson解析List的时候会用到,写法:


Type type = new TypeToken<List<Test>>() {}.getType();
List<Test> jsonBean = gson.fromJson(json, type);

当然,封装的时候这么写也不会报错:

Type type = new TypeToken<T>() {}.getType();
JsonBean  jsonBean = gson.fromJson(json, type);

这样如果传的不是泛型,而是一个包含泛型的类(比如公共的返回bean),最后解析出来的T是LinkedTreeMap,比如这样:

Type type = new TypeToken<BaseResponse<T>>() {}.getType();
BaseResponse jsonBean = gson.fromJson(json, type);

BaseResponse代码如下:

public class BaseResponse<E> {
    @SerializedName("code")
    public String code;
    @SerializedName("msg")
    public String message;
    @SerializedName("result")
    public E result;
}

因为一般网络请求的数据结构我们都会这样做BaseResponse,而这样是没法正常解析出我们想要的对象的。所以看顶部参考的两个文章里发现了都是用的是ParameterizedType 来解析(这里就不对ParameterizedType 过多说明,大家可以参考上面的文章):

新建一个继承ParameterizedType的类:

public class ParameterizedTypeImpl implements ParameterizedType {
    private final Class raw;
    private final Type[] args;
    public ParameterizedTypeImpl(Class raw, Type[] args) {
        this.raw = raw;
        this.args = args != null ? args : new Type[0];
    }
    @Override
    public Type[] getActualTypeArguments() {
        return args;
    }
    @Override
    public Type getRawType() {
        return raw;
    }
    @Override
    public Type getOwnerType() {return null;}
}

然后解析的时候使用

public abstract class ResponseObserver<T> implements Observer<ResponseBody> {

    @Override
    public void onNext(ResponseBody responseBody) {
        String str = responseBody.string();
        Type type = getClass().getGenericSuperclass();
        if(type instanceof ParameterizedType){
                Type[] types = ((ParameterizedType)type).getActualTypeArguments();
                Type ty = new ParameterizedTypeImpl(BaseResponse.class, new Type[]{types[0]});
                BaseResponse<T> data = getGson().fromJson(str, ty);
                onSuccess(data.result);
        }
    }

    public abstract void onSuccess(T t);
}

ok,运行~ 结束!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值