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

今天,我本来想对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)
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. 泛型概述 泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,...
    JackChen1024阅读 524评论 0 3
  • 文章作者:Tyan博客:noahsnail.com 1. 什么是泛型 Java泛型(Generics)是JDK 5...
    SnailTyan阅读 792评论 0 3
  • 2.简单泛型 -********Java泛型的核心概念:告诉编译器想使用什么类型, 然后编译器帮你处理一切细节 2...
    CodingHou阅读 400评论 0 0
  • 开发人员在使用泛型的时候,很容易根据自己的直觉而犯一些错误。比如一个方法如果接收List作为形式参数,那么如果尝试...
    时待吾阅读 1,078评论 0 3
  • 对象的创建与销毁 Item 1: 使用static工厂方法,而不是构造函数创建对象:仅仅是创建对象的方法,并非Fa...
    孙小磊阅读 2,047评论 0 3