Android Kotlin中使用Gson解析JSON出现Expected BEGIN_OBJECT but was STRING异常的排查求助
解决Gson反序列化时的
Expected BEGIN_OBJECT but was STRING异常 首先明确一点:Gson完全支持列表反序列化,你的列表相关实体类定义是没问题的,问题出在data字段的处理上。
错误原因分析
你遇到的java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING异常,意思是Gson在解析$.data这个字段时,原本预期它是一个JSON对象(对应你的TimeTableData类),但实际拿到的是一个字符串类型的值。
这种情况通常是因为:
- 你的接口返回的JSON并非总是你提供的那种格式——比如在请求失败、参数错误等场景下,接口可能会把
data字段返回成字符串(比如空字符串""或者错误提示文本),而不是你期望的对象结构 - 你当前的实体类里把
data定义成了非空的TimeTableData对象,Gson无法将字符串转换为对象,因此抛出异常
解决方案
只需要修改TimeTableModel里的data字段,将其改为可空类型,让Gson在遇到data是字符串时自动解析为null即可:
import com.google.gson.annotations.SerializedName class TimeTableModel { @SerializedName("status") val status = 0 @SerializedName("message", alternate = ["msg"]) val message : String? = null // 这里也建议改成null,更贴合原JSON里msg为null的定义 @SerializedName("success") val success = false @SerializedName("data") val data : TimeTableData? = null // 改为可空类型,兼容data为字符串的场景 } // 其他实体类保持不变 class TimeTableData { @SerializedName("timeTables") val timeTables : List<TimeTableListData> = emptyList() } class TimeTableListData { @SerializedName("startTime") val startTime = "" @SerializedName("endTime") val endTime = "" @SerializedName("location") val location = "" @SerializedName("moduleCode") val moduleCode = "" @SerializedName("staffName") val staffName = "" }
另外,建议你额外检查一下get("$baseAddress/userTimeTable/findCalendarMessage")方法返回的原始JSON数据,确认在抛出异常时,data字段的实际值到底是什么——这能帮你进一步确认问题根源。
内容的提问来源于stack exchange,提问作者Hhry
相关产品推荐
相关产品推荐

