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;
    }

  • 相关阅读:
    【转】Linq Group by
    SmtpClient发邮件时为什么用MailMessage.From而不用MailMessage.Sender
    HttpClient异步调用WEB服务
    WPF MVVM框架下,VM界面写控件
    WPF 后台读取样式文件
    vs2017 乱码
    ClickOnce 和管理员权限
    EF code first Mysql 更换主键类型
    Linq Group By
    Mvc api HelpPage 与注释
  • 原文地址:https://www.cnblogs.com/hyhy904/p/10935220.html
Copyright © 2011-2022 走看看