谷歌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
解决方法:
原文地址:http://blog.csdn.net/submorino/article/details/43574043