泛型在使用 GSON 解析转换 LinkedTreeMap 无法正常解析

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();

各取所需吧!

后端开发技术笔记

iReport 5.6.0 安装完后无法打开解决方案

2020-5-14 13:24:44

后端开发

GSON 序列化解析时间异常

2020-7-11 18:50:00

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索