网络请求结果的解析问题

    public <T> OnHttpResultListener jsonHttpWithData(Class<T> clazz, OnUiCallback<T> onUiCallback, OnNextListener<T> onNextListener) {
        return new OnHttpResultListener() {
            @Override
            public void onSuccess(String s) {
                if (!TextUtils.isEmpty(s)) {
                    GsonResponsePasare<T> pasare = new GsonResponsePasare<T>() {

                    };
                    ResponseResult<T> responseResult = pasare.deal(s);
                    LogUtils.i(TAG, "responseResult ==" + new Gson().toJson(responseResult));
                    jsonData(responseResult, onUiCallback, onNextListener);
                } else {
                    if (onUiCallback != null) {
                        onUiCallback.onError(EXC_CODE, JSON_NULL);
                    }
                }
            }

            @Override
            public void onError(Throwable e) {
                onUiCallback.onError(EXC_CODE, e.getMessage() == null ? "" : e.getMessage());
            }
        };
    }
    class GsonResponsePasare<T> implements ParameterizedType {

        public ResponseResult<T> deal(String response) {
//            Type gsonType = new ParameterizedType() {//...};//不建议该方式,推荐采用GsonResponsePasare实现ParameterizedType.因为getActualTypeArguments这里涉及获取GsonResponsePasare的泛型集合
            Type gsonType = this;
            ResponseResult<T> result = new Gson().fromJson(response, gsonType);
//            LogUtils.e("Data is : " + commonResponse.data, "Class Type is : " + commonResponse.data.getClass().toString());
            return result;
        }

        @NotNull
        @Override
        public Type[] getActualTypeArguments() {

            Class clz = this.getClass();
            //这里必须注意在外面使用new GsonResponsePasare<GsonResponsePasare.DataInfo>(){};实例化时必须带上{},否则获取到的 superclass 为Object
            Type superclass = clz.getGenericSuperclass(); //getGenericSuperclass()获得带有泛型的父类
            if (superclass instanceof Class) {
                throw new RuntimeException("Missing type parameter.");
            }
            ParameterizedType parameterized = (ParameterizedType) superclass;
            Type[] types = parameterized.getActualTypeArguments();
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
                LogUtils.i(TAG, "getActualTypeArguments types =" + types[0].getTypeName());
            }
            return types;
        }

        @Override
        public Type getOwnerType() {
            return null;
        }

        @Override
        public Type getRawType() {
            return ResponseResult.class;
        }
    }

 

    public OnHttpResultListener jsonLogin(OnUiCallback<Token> callback) {
        return jsonHttpWithData(Token.class, callback, new OnNextListener<Token>() {
            @Override
            public void onNext(Token token) {
                CacheDataModel.getInstance().saveLoginData(token);
            }
        });
    }

调用:

jsonLogin 开始

 

 

异常:

Caused by: java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to com.xx.xx.entity.response.VehicleBindingList

 

请求结果共用了ResponseResult<T> result = new Gson().fromJson(response, gsonType);

问题原因:泛型没有指定具体类型。

想问一下怎么解决,想共用fromJson这行代码

 

 

 


public class ResponseResult<T> {
    private String code;
    private T data;
    private String msg;
    private String requestId;
    private String time;

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public String getRequestId() {
        return requestId;
    }

    public void setRequestId(String requestId) {
        this.requestId = requestId;
    }

    public String getTime() {
        return time;
    }

    public void setTime(String time) {
        this.time = time;
    }
}

请求结果解析,共用了jsonHttpWithData方法。Class<T> clazz 现在没有用上,之前有用到。

为什么不用 

        return new ParameterizedType() {
            @Override
            public Type[] getActualTypeArguments() {
                return args;
            }

            @Override
            public Type getRawType() {
                return raw;
            }

            @Override
            public Type getOwnerType() {
                return null;
            }
        };

没有这样直接指定的原因是:data 不只是 object ,还可能是 List<Object>

 

 

 

 

不要沉,麻烦大神给点指导,感谢~~~~~~~~~~~~~

ResponseResult<T> result = new Gson().fromJson(response, gsonType);

Gson对object与List<Object>的转换是不同的,这里应该要做下区分吧

Person person=gson.fromJson(jsonData,Person.class);
List<Person> list= gson.fromJson(jsonList, new TypeToken<List<Person>>() {}.getType());

有考虑这个吗,代码太多了,不确定是不是这个原因