美文网首页AndroidAndroid技术知识Android知识
Gson解析Json数组遇到的泛型类型擦除问题

Gson解析Json数组遇到的泛型类型擦除问题

作者: yoosir | 来源:发表于2016-11-16 21:03 被阅读0次

今天,我本来想对Gson做一个小小封装的,但却遇到了 Gson解析Json数组遇到的泛型类型擦除问题,下面对此做下记录。

错误的方式

// 将Json数组解析成相应的映射对象列表
public static <T> ArrayList<T> parseJsonArray(Class<T> myClass,String jsonStr)throws Exception{
   return new Gson().fromJson(jsonStr,new TypeToken<ArrayList<T>>(){}.getType());
}

这样写,运行会报错 数据类型不匹配,Gson 返回的数据类型是 List<LinkedTreeMap> ,不是我们想要的 List<MyClass>

解决方法

网上找到了两篇文章:
Gson TypeToken with dynamic ArrayList item type
Java泛型-类型擦除

解决结果

Gson gson = new Gson();
//解析 Json对象
public static <T> T parseJson(Class<T> type,String jsonStr)throws Exception{
   return gson.fromJson(jsonStr,type);
}
// 将Json数组解析成相应的映射对象列表
public static <T> ArrayList<T> parseJsonArray(Class<T> myClass,String jsonStr)throws Exception{
   Type type = new ListParameterizedType(myClass);
   return gson.fromJson(jsonStr, type);
}

private static class ListParameterizedType implements ParameterizedType {
   private Type type;
   private ListParameterizedType(Type type) {
      this.type = type;
   }
   @Override
   public Type[] getActualTypeArguments() {
      return new Type[] {type};
   }
   @Override
   public Type getRawType() {
      return ArrayList.class;
   }
   @Override
   public Type getOwnerType() {
      return null;
   }
   // implement equals method too! (as per javadoc)
}

相关文章

网友评论

    本文标题:Gson解析Json数组遇到的泛型类型擦除问题

    本文链接:https://www.haomeiwen.com/subject/nkgrpttx.html