Android Gson to Json类型转换异常解决方法_android 13以上gson.tojson转换带冒号的失败了

前言

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

与君共勉

我要一步一步往上爬
在最高点乘着叶片往前飞
任风吹干流过的泪和汗
我要一步一步往上爬
等待阳光静静看着它的脸
小小的天有大大的梦想
我有属于我的天
任风吹干流过的泪和汗
总有一天我有属于我的天
这里写图片描述