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

Release模式下Retrofit+Gson出现ClassCastException问题求助

解决方案:Release模式下Gson反序列化List出现ClassCastException

问题原因

Release模式中ProGuard对数据类进行了混淆,导致Gson在处理泛型列表List<CatListItem>时,无法识别列表元素的具体类型,只能将每个元素默认解析为LinkedTreeMap,最终在类型转换时抛出ClassCastException。

解决步骤

1. 修复ProGuard混淆规则

在你的ProGuard配置文件中添加以下规则,确保数据类的完整结构不被混淆:

# 保留你的数据类(替换为实际包路径)
-keep class com.yourpackage.CatList { *; }
-keep class com.yourpackage.CatListItem { *; }

# 如果你的数据类都在同一个包下,可以批量保留
# -keep class com.yourpackage.models.** { *; }

# 补充:确保泛型类型信息不被混淆(可选但建议)
-keepattributes Signature

解释:

  • 原规则仅保留了SerializedName注解的字段,但类名、泛型参数信息被混淆后,Gson无法通过反射确定列表元素的具体类型,只能 fallback 到LinkedTreeMap。
  • -keepattributes Signature用于保留泛型签名信息,帮助Gson正确解析泛型类型。

2. 校验接口与数据结构的匹配(可选优化)

你的接口返回的JSON是直接的数组[{"name":"1"},{"name":"2"}],接口定义Call<List<CatListItem>?>是正确的,但在onResponse中你用CatList(response.body())创建对象,而CatList类是包含catList字段的包装类,这与返回数据结构不匹配。如果后端确实返回数组,你可以直接使用response.body()获取List<CatListItem>?,无需用CatList包装;如果后端后续会改为返回包含catList字段的对象,那么需要调整接口定义为Call<CatList>。

验证

修改完ProGuard规则后,重新构建Release版本并测试,确认ClassCastException是否消失。

内容的提问来源于stack exchange,提问作者Julio Leon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 12:10:24