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

如何在Kotlin中用Gson结合数据类解析JSON数组?

解决Gson解析OpenStreetMap Nominatim JSON数组报错问题

报错原因

你遇到的IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY错误,核心原因是Java/Kotlin的类型擦除机制导致Gson无法识别你要解析的是List<Destination>类型。直接传入Destination::class.java时,Gson会默认尝试将JSON解析为单个Destination对象,但Nominatim返回的是JSON数组,因此类型不匹配报错。

解决方案

有两种可靠的修复方式:

方法1:使用TypeToken指定泛型类型

通过TypeToken明确告诉Gson要解析的是List<Destination>类型,绕过类型擦除的限制:

import com.google.gson.reflect.TypeToken

// 定义泛型类型
val listType = object : TypeToken<List<Destination>>() {}.type
// 解析JSON数组为List<Destination>
val list = Gson().fromJson<List<Destination>>(body, listType)

方法2:先解析为数组再转成List

利用数组类型没有泛型擦除问题的特性,先解析成Array<Destination>,再转换为List:

// 先解析为数组
val destinationArray = Gson().fromJson<Array<Destination>>(body, Destination::class.java)
// 转换为List
val list = destinationArray.toList()

额外验证:数据类字段兼容性

Nominatim返回的lat和lon字段是字符串格式(例如"51.5054975"),不过Gson会自动将字符串类型的数字转换为Double,所以你定义的Destination数据类是可以正常工作的。如果后续遇到字段解析失败,可以考虑将lat和lon先定义为String,再手动转换为Double。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 06:25:19