zoukankan      html  css  js  c++  java
  • 使用Gson解析Json数组遇到的泛型类型擦除问题解决方法

    谷歌Gson转换Json串有如下方法:

    public Object fromJson(String json, Type typeOfT);
    1
    可以使用它进行数组解析。如下,使用此方法解析Json串为类型MyBean的List数组,方法可用。

    List<MyBean> lst = new Gson().fromJson(data, new TypeToken<List<MyBean>>(){}.getType());
    1
    但如果把MyBean改为泛型T,封装此方法为如下:

    List<T> lst = new Gson().fromJson(data, new TypeToken<List<T>>(){}.getType());
    public static <T> List<T> parseJson2List(String data, Class<T> clazz){
    try {
    return new Gson().fromJson(data, new TypeToken<List<T>>(){}.getType());
    } catch(Throwable e){
    e.printStackTrace();
    return null;
    }
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    例,实例化泛型为Test

    class Test {
    private String id;
    private String name;
    private String value;
    }
    1
    2
    3
    4
    5
    调用封装方法如下:

    List<Test> lst = parseJson2List(new String("[{id:'myid',name:'myname',value:'myvaule'},{id:'myid',name:'myname',value:'myvaule'}]"), Test.class);
    1
    调试结果如下图,数组对象为LinkedTreeMap类型,并不是预期的Test类型。
    在这里插入图片描述

    原因:泛型在编译期类型擦除导致,类型擦除可见如下链接:

    http://stackoverflow.com/questions/20773850/gson-typetoken-with-dynamic-arraylist-item-type

    http://blog.csdn.net/gstormspire/article/details/7638638

    解决方法:


    public static <T> List<T> fromJsonArray(String json, Class<T> clazz) throws Exception {
    List<T> lst = new ArrayList<T>();

    JsonArray array = new JsonParser().parse(json).getAsJsonArray();
    for(final JsonElement elem : array){
    lst.add(new Gson().fromJson(elem, clazz));
    }

    return lst;
    }

  • 相关阅读:
    多线程 wait和sleep区别
    什么是分布式系统,如何学习分布式系统
    Mybatis传多个参数(三种解决方案)
    UML中类之间的几种关系
    前缀、中缀、后缀表达式
    数据库连接池c3p0和dbcp
    代码收藏
    spark教程(12)-生态与原理
    spark教程(10)-sparkSQL
    spark教程(九)-操作数据库
  • 原文地址:https://www.cnblogs.com/hyhy904/p/10935220.html
Copyright © 2011-2022 走看看