使用Gson解析Json数组遇到的泛型类型擦除问题解决方法
2015-02-06 21:31
916 查看
谷歌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
解决方法:
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;
}
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
解决方法:
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;
}
相关文章推荐
- 在线聊天项目1.4版 使用Gson方法解析Json字符串以便重构request和response的各种请求和响应 解决聊天不畅问题 Gson包下载地址
- 解决android使用gson解析json字符串,并使用混淆编译方式打包apk遇到的问题
- 解决android使用gson解析json字符串,并使用混淆编译方式打包apk遇到的问题
- 在线聊天项目1.4版 使用Gson方法解析Json字符串以便重构request和response的各种请求和响应 解决聊天不畅问题 Gson包下载地址
- 解决android使用gson解析json字符串,并使用混淆编译方式打包apk遇到的问题
- 解决android使用gson解析json字符串,并使用混淆编译方式打包apk遇到的问题
- 使用Navicat Premium将Oracle数据库中的表和数据迁移到MySQL数据库中,遇到的Date类型出现精度问题及解决方法
- 使用Gson解析json在打包混淆时出错的解决方法
- 使用Gson和FastJson解析JSON数据遇到的问题
- C#字符串数组排序 C#排序算法大全 C#字符串比较方法 一个.NET通用JSON解析/构建类的实现(c#) C#处理Json文件 asp.net使用Jquery+iframe传值问题
- volley 访问网络时候获取json数据发生乱码问题解决方法,以及gson解析json数据。
- 使用Gson解析json在打包混淆时出错的解决方法
- 在使用Gson的toJson()方法转为json字符串的时候无法显示中文和符号的问题(已解决)
- 容易被忽略的细节(2):使用泛型类和泛型方法解决【动态类型】问题
- Android使用Gson解析json时候的泛类型丢失问题
- android客户端解析本地json数组出现乱码问题解决方法
- VC轻松解析XML文件--CMarkup使用方法(解决解析中文字符出现乱码问题)
- LoadRunner在使用时遇到的问题及解决方法
- J2ME使用WTK模拟器开发时候遇到“OK to use Airtime” 问题的解决方法
- 使用SourceSafe管理软件开发可能遇到的问题及解决方法