杂记篇 — JSON解析泛型数据封装网络请求

2020-04-22  本文已影响0人  一盘好书

1 解析泛型数据

当使用JSON进行网络数据解析时,我们通常希望往回调函数传递什么参数,JSON就能解析成相应对象给我们。

我们来用伪代码来看看网络请求中解析泛型的过程是怎么样的,网络请求时,我们通常希望的过程是如下这个样子:

Request request = new Request();

ResultCallBack callBack = new ResultCallBack<Fruit>(){

    @Override
    public void onResponseSuccess(Fruit fruit) {
        LogUtils.d("fruit: " + fruit.price);
    }
};
request.sendRequest(callBack);

而ResultCallBack的代码也相当简单,这里就只添加了成功返回时的方法,失败的也类似。

public abstract class ResultCallBack<T> {
    public abstract void onResponseSuccess(T t);
}

而请求的伪代码如下:

    public <T> void sendRequest(ResultCallBack<T> callBack) {

        String result = "{\n" +
                "    \"price\": 12\n" +
                "}";

        // 获取callBack类父类的类信息
        Type callBackType = callBack.getClass().getGenericSuperclass();
        if (callBackType != null) {
            // 获取泛型类型数组
            Type[] array = ((ParameterizedType) callBackType).getActualTypeArguments();
                        
            Object obj = JSON.parseObject(result, array[0]);

            callBack.onResponseSuccess((T) obj);
        }
    }

2 问题

之前在网上看到有人问:为什么只有ResultCallBack为抽象类时,getGenericSuperclass方法获取的type值才能转换成ParameterizedType类型并且获得相应的泛型类型。

其实想搞懂这个问题,我们得先看看getGenericSuperclass这个方法,它是表示返回父类的type类信息,当ResultCallBack为抽象类,那所有由ResultCallBack进行初始化的类,全部都是ResultCallBack的子类,这样getGenericSuperclass方法才能获取到ResultCallBack的所有type信息,包括泛型信息。

上一篇 下一篇

猜你喜欢

热点阅读