在写项目中的数据缓存时 遇到gson to json时的类型转换异常 在此记录一下解决此问题的方法
我们从后台或者网络中请求到数据 都是这样的形式List
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 ListOfSomethingimplements ParameterizedType { private Class wrapped; public ListOfSomething(Class wrapped) { this.wrapped = wrapped; } // 返回List 里的Key和Model,所以这里返回[Key.class,Model.clas] public Type[] getActualTypeArguments() { return new Type[] {wrapped}; } // List 里的List,所以返回值是List.class public Type getRawType() { return List.class; } // 用于这个泛型上中包含了内部类的情况,一般返回null public Type getOwnerType() { return null; } }
/** * 集合数据存 * @param key * @param list * @param*/ public static void saveList(String key, List list) { Gson gson = new Gson(); String saveListStr = gson.toJson(list, new TypeToken<> >(){}.getType()); Timber.d("saved list:%s", saveListStr); putString(key, saveListStr); } /** * 集合数据取 * @param key * @param tClass * @param * @return */ public static List getList(String key, Class tClass) { Gson gson = new Gson(); String json = getString(key, "[]"); return gson.fromJson(json, new ListOfSomething<>(tClass)); }
如此便解决了 gson to json时遇到的类型转换异常问题
用ParameterizedType是一个很优的解决方案,之前不知道,卡了很久才解决这个问题 !