美文网首页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