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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 11:12:28