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

