Gson解析 泛型对象接收 出问题了

傲娇强 2015-11-30 08:00:44
接收的对象

public class HttpResponse<T> implements Serializable {
private int code;
private String msg;
private boolean success;
private T result;
// get set.....
}

Gson解析 由于封装原因 没有把这个T泛型传递到解析的地方,通过abstract class ResultCallback<T> 把 HttpResponse<T> 传递过去
HttpResponse<T> 里面的泛型 在调用请求api方法的时候传递

框架中 通过
static Type getSuperclassTypeParameter(Class<?> subclass) {
Type superclass = subclass.getGenericSuperclass();
if (superclass instanceof Class) {
throw new RuntimeException("Missing type parameter.");
}
ParameterizedType parameterized = (ParameterizedType) superclass;
return $Gson$Types.canonicalize(parameterized.getActualTypeArguments()[0]);
}

得到回调传递过来的泛型也就是HttpResponse
之后通过mGson.fromJson(string, resCallBack.mType); 解析 取到ResultCallback<T> 的泛型,能成功解析
但是
HttpResponse<T> 里面的泛型 赋值的 对象类型 始终是解析成了String,未找到解决办法
比如:
java.lang.ClassCastException: com.google.gson.internal.StringMap cannot be cast to com.xxx.xxx.bean.LoginInfo

LoginInfo就是HttpResponse<LoginInfo>
有大神能帮我解决这个问题吗 在不更换json解析依赖的情况下 ,如何解决Gson解析成泛型对象的问题呢?????
...全文
250 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
jklwan 2015-12-01
  • 打赏
  • 举报
回复
在使用的时候还是要转为具体的类型才行,你可以定义一个主的请求类,例如

public class MainHttpResponse implements Serializable {
    private int code;  
    private String msg; 
    private boolean success; 
    // get set.....
}
定义具体的子类就是

public class LoginInfoResponse extends MainHttpResponse {
       private LoginInfo result; 
      // get set……
}
至于ResultCallback的定义的格式是

public abstract class ResultCallback<T extends MainHttpResponse >{

    private Class<T> entityClass = null;

    /**
     * 获取泛型T的Class
     * @return
     */
    public Class<T> getEntityClass() {
        Type t = getClass().getGenericSuperclass();
        if(t instanceof ParameterizedType){
            Type[] p = ((ParameterizedType)t).getActualTypeArguments();
            entityClass = (Class<T>)p[0];
        }
        return  entityClass;
    }
    // other method
}
在请求返回结果解析时就用这个getEntityClass来获取类型解析,
T result = new Gson().fromJson(resultStr, resultCallBack.getEntityClass());
返回的T就是LoginInfoResponse等子类,可以直接使用。 需要对每种请求结果都要建立一个结果类型。

80,350

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧