You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GSON解析含JSONArray字段的类时抛出类型不匹配异常

问题根因

报错核心是两个错误叠加,和JSON本身结构无关:

  • 跨库类型不兼容:你在Clan类中引用的JSONObject、JSONArray属于org.json原生库的类型,Gson默认不识别这两个类型。Gson内置的JSON树结构类型是com.google.gson.JsonObject(对应JSON对象)、com.google.gson.JsonArray(对应JSON数组)。你第一次声明labels为org.json.JSONObject时,Gson读到数组结构自然提示期待对象、实际是数组;改成org.json.JSONArray后,因为Gson没有对应类型的转换适配器,类型匹配逻辑错位,才会反过来提示期待数组、实际是对象。
  • 字段名拼写不匹配:待解析JSON中的成员列表字段键名为memberList,你自定义类中写的是membersList,多了一个s,即便类型修正后这个字段也会解析为空。

另外你当前的解析逻辑做了无意义的中转:先用org.json的JSONTokener把输入流转成org.json.JSONObject,再转成字符串传给Gson,这一步不仅浪费性能,还可能引入字符转义问题。

修复步骤
  • 替换Clan类中的JSON类型:将所有嵌套对象字段的类型从org.json.JSONObject改为com.google.gson.JsonObject,将labels、成员列表字段的类型从org.json.JSONArray改为com.google.gson.JsonArray。
  • 修正字段映射:要么把类中的membersList字段改名为memberList,和JSON键名完全一致;要么在字段上加@SerializedName("memberList")注解做显式映射,不需要改动字段名。
  • 简化解析逻辑:去掉org.json的中转步骤,直接把HTTP连接返回的输入流转为Reader后传给Gson解析即可,参考代码:
Gson gson = new Gson();
try (InputStream is = httpConnection.getInputStream();
     InputStreamReader reader = new InputStreamReader(is, StandardCharsets.UTF_8)) {
    Clan clanInstance = gson.fromJson(reader, Clan.class);
}

如果你非要在Clan类里用org.json的JSON类型,必须手动为Gson注册对应TypeAdapter实现跨库类型转换,平白增加冗余代码,没有实际必要。

内容的提问来源于stack exchange,提问作者Ben Parry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 09:12:16