码迷,mamicode.com
首页 > 编程语言 > 详细

使用Gson解析Json数组遇到的泛型类型擦除问题解决方法

时间:2015-02-06 21:49:39      阅读:300      评论:0      收藏:0      [点我收藏+]

标签:gson   json   bean   泛型   类型擦除   

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

public Object fromJson(String json, Type typeOfT);

可以使用它进行数组解析。如下,使用此方法解析Json串为类型MyBean的List数组,方法可用。

List<MyBean> lst = new Gson().fromJson(data, new TypeToken<List<MyBean>>(){}.getType());

但如果把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;
}
}

例,实例化泛型为Test

class Test {
private String id;
private String name;
private String value;
}

调用封装方法如下:

List<Test> lst = parseJson2List(new String("[{id:'myid',name:'myname',value:'myvaule'},{id:'myid',name:'myname',value:'myvaule'}]"), Test.class);

调试结果如下图,数组对象为LinkedTreeMap类型,并不是预期的Test类型。

技术分享
技术分享
技术分享
技术分享

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

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

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


解决方法:

  1. public static <T> List<T> fromJsonArray(String json, Class<T> clazz) throws Exception {  
  2.         List<T> lst =  new ArrayList<T>();  
  3.           
  4.         JsonArray array = new JsonParser().parse(json).getAsJsonArray();  
  5.         for(final JsonElement elem : array){  
  6.             lst.add(new Gson().fromJson(elem, clazz));  
  7.         }  
  8.           
  9.         return lst;  
  10.     }  

使用Gson解析Json数组遇到的泛型类型擦除问题解决方法

标签:gson   json   bean   泛型   类型擦除   

原文地址:http://blog.csdn.net/submorino/article/details/43574043

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!