前言
在写项目中的数据缓存时 遇到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,...}}
- 1
- 2
- 3
- 4
data 为 array的情况:
{"code":"0","message":"success","data":[sortNo=1, isDiplay='0',
catalogDesc='为客户定制每间会议室', isSubcribe='0', isCollect='null', minConsume=2000.0]}
- 1
- 2
上面是请求到的数据 对应着一个homeModel
,如果有很多数据类型 那么就会对应很多的数据模型
,每一个都要写重复的代码 确实不太好。因此我们可以考虑使用 泛型
,Gson
为我们提供了TypeToken
来实现对泛型的支持.
最简单的方法就是提供两个方法分别对应data为Array和Object的情况并接收一个参数,即告知XXX的类型,自动将完成new TypeToken(){}与new TypeToken<Result<List>>(){}的过程。
TypeToken
的作用是用于获取泛型的类,返回的类型为Type
,真正的泛型信息就是放在这个Type里面,既然用TypeToken
生成会有问题,那我们自己生成Type就行了嘛。
Type是Java中所有类型的父接口,在1.8以前是一个空接口,自1.8起多了个getTypeName()
方法,下面有ParameterizedType、 GenericArrayType、 WildcardType、 TypeVariable
几个接口,以及Class类。这几个接口在本次封装过程中只会用到 ParameterizedType
,所以简单说一下:
ParameterizedType 简单说来就是形如“ 类型<> ”的类型,如:List<Key,Model>
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;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
封装方法
/**
* 集合数据存
* @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));
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
如此便解决了 gson to json时遇到的类型转换异常问题
总结:
用ParameterizedType是一个很优的解决方案,
之前不知道,卡了很久才解决这个问题 !
与君共勉
我要一步一步往上爬
在最高点乘着叶片往前飞
任风吹干流过的泪和汗
我要一步一步往上爬
等待阳光静静看着它的脸
小小的天有大大的梦想
我有属于我的天
任风吹干流过的泪和汗
总有一天我有属于我的天