Android Kotlin + Klaxon:JSON根数组解析问题
解决Klaxon解析根为数组的JSON时的ClassCastException问题
我来帮你捋捋这个问题——你遇到的java.lang.ClassCastException: com.beust.klaxon.JsonArray cannot be cast to com.beust.klaxon.JsonObject,核心原因就是把根级别的JSON数组当成JSON对象来解析了。Klaxon对根节点的类型判断很严格,根是数组的话必须用对应的数组解析方法,不能硬套JsonObject的逻辑。
下面给你分两种场景的解决方案,都是日常开发里最常用的:
1. 直接操作JSON原生结构(JsonArray/JsonObject)
如果不需要映射到自定义数据类,直接解析成JsonArray再逐个处理元素就好:
val klaxon = Klaxon() // 示例根为数组的JSON字符串 val jsonStr = """[{"id":1,"title":"First"},{"id":2,"title":"Second"}]""" // 关键:用parse<JsonArray<*>>解析根数组,而不是parse<JsonObject> val jsonArray = klaxon.parse<JsonArray<*>>(jsonStr) // 遍历数组,把每个元素转成JsonObject处理 jsonArray?.forEach { element -> val obj = element as JsonObject val id = obj.int("id") val title = obj.string("title") println("ID: $id, Title: $title") }
2. 映射到自定义数据类的List
如果有对应的数据模型,用parseArray方法直接解析成List会更方便,还能避免类型转换的麻烦:
// 先定义和JSON字段匹配的数据类 data class Item(val id: Int, val title: String) val klaxon = Klaxon() val jsonStr = """[{"id":1,"title":"First"},{"id":2,"title":"Second"}]""" // 关键:用parseArray<T>而不是parse<T> val itemList = klaxon.parseArray<Item>(jsonStr) // 直接操作List里的对象 itemList?.forEach { item -> println("ID: ${item.id}, Title: ${item.title}") }
常见错误排查
你之前要么得到空列表要么抛异常,大概率是踩了这几个坑:
- 错误1:用
parse<JsonObject>解析根数组:这直接会触发ClassCastException,完全是类型不匹配导致的,必须换数组相关的解析方法。 - 错误2:数据类字段和JSON字段不匹配:如果字段名不一样(比如JSON里是
user_id,数据类里是id),会导致解析后字段为空,甚至整个列表为空。这种情况可以用@Json注解做映射:data class Item( @Json(name = "user_id") val id: Int, @Json(name = "user_title") val title: String ) - 错误3:JSON格式不合法:比如括号不闭合、逗号多写/漏写,Klaxon解析失败会返回空列表。可以先把JSON字符串放到校验工具里确认格式没问题。
内容的提问来源于stack exchange,提问作者Vaiden
相关产品推荐
相关产品推荐

