使用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
相关产品推荐
相关产品推荐

