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

Kotlin使用Ktor解析JSON遇JsonConvertException错误如何解决?

解决Ktor JSON解析的JsonConvertException: Illegal input错误

错误原因

问题出在API返回的JSON结构并非直接的MenuItems数组,而是一个外层对象,其中包含名为menu的数组字段;同时MenuItems类中price字段的类型与API返回的实际数据类型不匹配,双重因素导致了解析失败。

修改步骤

1. 新增外层响应数据类

创建一个对应API根结构的序列化数据类,用来包裹菜单数组:

@Serializable
data class MenuResponse(
    val menu: List<MenuItems>
)

2. 调整fetchMenu函数的解析逻辑

先将响应解析为外层对象,再提取内部的菜单列表:

private suspend fun fetchMenu(): List<MenuItems> {
    val response = httpClient
        .get("https://raw.githubusercontent.com/Meta-Mobile-Developer-PC/Working-With-Data-API/main/littleLemonSimpleMenu.json")
        .body<MenuResponse>()
    return response.menu
}

3. 修正MenuItems的price字段类型

API返回的price为浮点型(如12.99),需将price的类型从Int改为Double:

@Serializable
data class MenuItems(
    val id: Int,
    val title: String,
    val price: Double
) {
    fun toMenuItemRoom() = MenuItemRoom(
        id, title, price
    )
}

4. 优化Ktor的Json配置(可选但推荐)

若API返回的JSON包含未在数据类中定义的字段,需在HttpClient配置中开启忽略未知字段,避免解析报错:

val httpClient = HttpClient(OkHttp) {
    install(ContentNegotiation) {
        json(Json {
            ignoreUnknownKeys = true
            isLenient = true // 兼容宽松格式的JSON
        })
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 10:42:26