前言
在写项目中的数据缓存时 遇到gson to json
时的类型转换异常 在此记录一下解决此问题的方法
进入正题
我们从后台或者网络中请求到数据 都是这样的形式List<homeModel>
下面以我公司的后台数据为例
data 为 object 的情况:
{"code":"0","message":"success","data":{goodsName='蔬菜1箱(4瓜菜+4叶菜)',
goodsOldPrice=198.0, goodsRealPrice=168.0, goodsPostage=0.0,...}}
data 为 array的情况:
{"code":"0","message":"success","data":[sortNo=1, isDiplay='0',
catalogDesc='为客户定制每间会议室', isSubcribe='0', isCollect='null', minConsume=2000.0]}
上面是请求到的数据 对应着一个homeModel
,如果有很多数据类型 那么就会对应很多的数据模型
,没一个都要写重复的代码 确实不太好。因此我们可以考虑使用 泛型
,Gson
为我们提供了TypeToken
来实现对泛型的支持.
最简单的方法就是提供两个方法分别对应data为Array和Object的情况并接收一个参数,即告知XXX的类型,自动将完成new TypeToken(){}与new TypeToken
public class ListOfSomething<X> implements ParameterizedType {
private Class<?> wrapped;
public ListOfSomething(Class<X> wrapped) {
this.wrapped = wrapped;
}
// 返回List<Key,Model>里的Key和Model,所以这里返回[Key.class,Model.clas]
public Type[] getActualTypeArguments() {
return new Type[] {wrapped};
}
// List<Key,Model>里的List,所以返回值是List.class
public Type getRawType() {
return List.class;
}
// 用于这个泛型上中包含了内部类的情况,一般返回null
public Type getOwnerType() {
return null;
}
}
封装方法
/**
* 集合数据存
* @param key
* @param list
* @param <T>
*/
public static <T>void saveList(String key, List<T> list) {
Gson gson = new Gson();
String saveListStr = gson.toJson(list, new TypeToken<List<T>>(){}.getType());
Timber.d("saved list:%s", saveListStr);
putString(key, saveListStr);
}
/**
* 集合数据取
* @param key
* @param tClass
* @param <T>
* @return
*/
public static <T>List<T> getList(String key, Class<T> tClass) {
Gson gson = new Gson();
String json = getString(key, "[]");
return gson.fromJson(json, new ListOfSomething<>(tClass));
}
如此便解决了 gson to json时遇到的类型转换异常问题
总结:
用ParameterizedType是一个很优的解决方案,之前不知道,卡了很久才解决这个问题 !