如何在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
相关产品推荐
相关产品推荐

