频道栏目
首页 > 资讯 > 其他 > 正文

写项目中的数据缓存时gson to json遇到的类型转换异常问题的解决办法

18-07-30        来源:[db:作者]  
收藏   我要投稿
前言

在写项目中的数据缓存时 遇到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 ListOfSomething implements 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是一个很优的解决方案,之前不知道,卡了很久才解决这个问题 !

相关TAG标签
上一篇:关于线程交替打印奇偶数的实例讲解
下一篇:关于okhttp拦截器添加公共参数和response读取后不能返回的解决办法
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站