GSON 解析带泛型的 JSON 数组 LinkedTreeMap 的问题
在使用泛型的时候,使用 new Gson() 进行解析,会被在编译期类型被擦除导致的,网上遇到这种问题的很多,这里记录一下
数据格式:正常的数组,演示用
[ { "webName":"izpan", "webUrl":"izpan.com" }, { "webName":"izpan2", "webUrl":"izpan.com2" }, { "webName":"izpan3", "webUrl":"izpan.com3" } ]
进行转换:
List webDOS = new Gson().fromJson(json, ArrayList.class);
输出:
String webName = webDOS.get(i).getWebName();
主要的异常提示:
java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to com.izpan.entity.webDO
得到的错误就是 com.google.gson.internal.LinkedTreeMap
无法转换成 webDO
主要原因:
编译期类型被擦除导致
解决方法一:指定类型转换(推荐)
List webDOS = new Gson().fromJson(json, new TypeToken<List<WebDO>>(){}.getType());
String webName = webDOS.get(i).getWebName();
TypeToken是 GSON 提供的数据类型转换器,可以支持各种数据集合类型转换。
解决方法二:循环转换
List webDOS = new ArrayList<>(); JsonArray array = new JsonParser().parse(json).getAsJsonArray(); for (final JsonElement elem : array) { webDOS.add(gson.fromJson(elem, WebDO.class)); } String webName = webDOS.get(i).getWebName();
解决方法三:强制转换
T[] list = new Gson().fromJson(json, (Type) WebDO[].class); WebDO webDO = (WebDO) list[i]; String webName = webDO.getWebName();
或
List webDOS = (List) Arrays.asList(list); String webName = webDOS.get(i).getWebName();
各取所需吧!