关于Retrofit2 gson转换器,怎么去自定义能转换不同对象问题。
如图,如果我调用的不是BasicResponse对象类型的json,他就会解析不了,那有什么办法,可以让他解析不同类型的对象了?
关于Retrofit2 gson转换器,怎么去自定义能转换不同对象问题。
如图,如果我调用的不是BasicResponse对象类型的json,他就会解析不了,那有什么办法,可以让他解析不同类型的对象了?
问题现象: 当使用 Gson 解析 json 数据时,如果结果类型是一个泛型比如 T,此时这个 T 如果又被其他类包裹,就会抛出异常:Caused by: java.lang.ClassCastException : com.google.gson.internal.LinkedTreeMap cannot be cast to …
public static <T> ApiResponse<T> fromJson(String json){
return new Gson().fromJson(json, new TypeToken<ApiResponse<T>>() {}.getType());
}
原因分析: Gson 中的 TypeToken 的实现逻辑是,根据 TypeToken 的派生类 , 使用 getGenericSuperclass 获取泛型信息,而泛型并没有办法被正确的传递。
解决方案: 修改 fromJson 方法传递正确的类型,代码如下:
public static <T> ApiResponse<T> fromJson(String json,Class<T> cla) {
Type type= $Gson$Types.newParameterizedTypeWithOwner(null, ApiResponse.class, cla);
return new Gson().fromJson(json, type);
}