关于gson to json时遇到的类型转换异常问题处理

前言

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

猜你喜欢

转载自blog.csdn.net/life_s/article/details/81218229