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

使用GSON TypeToken解析含JSON数组的字符串时遇JsonSyntaxException

解决GSON解析JSON对象为List的错误

你的JSON根节点是对象(包含message数组和status字段),但你直接尝试将整个JSON解析为List<String>,GSON期望根节点是数组,因此抛出"Expected BEGIN_ARRAY but was BEGIN_OBJECT"异常。以下是两种修复方案:

方案1:定义对应的数据类(推荐)

创建与JSON结构匹配的数据类,先解析整个对象,再提取数组字段:

// 匹配JSON结构的数据类
data class FruitResponse(
    val message: List<String>,
    val status: String
)

// 解析代码
val gson = GsonBuilder().setPrettyPrinting()
                        .disableHtmlEscaping()
                        .serializeNulls()
                        .create()

// 解析为FruitResponse对象
val fruitResponse = gson.fromJson<FruitResponse>(jsonStr, FruitResponse::class.java)
// 提取图片URL列表
val fruitPicturesList = fruitResponse.message

方案2:直接提取指定字段(无需数据类)

先将JSON解析为JsonObject,再提取message数组并转换为List<String>:

val gson = GsonBuilder().setPrettyPrinting()
                        .disableHtmlEscaping()
                        .serializeNulls()
                        .create()

// 解析为JsonObject
val jsonObject = gson.fromJson(jsonStr, JsonObject::class.java)
// 获取message对应的JsonArray
val messageArray = jsonObject.getAsJsonArray("message")
// 将JsonArray转换为List<String>
val fruitPicturesList = gson.fromJson<List<String>>(messageArray, object : TypeToken<List<String>>() {}.type)

方案对比

  • 方案1更符合规范,便于维护和扩展,适合JSON结构固定的场景。
  • 方案2适合临时只需要提取单个字段的场景,无需额外定义数据类。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 01:22:44