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

使用Ktor客户端调用Kinopoisk非官方API遇JsonConvertException异常求助

解决方案:io.ktor.serialization.JsonConvertException: Illegal input 排查与修复

核心排查与修复点

1. 数据类与JSON响应不匹配

这是触发该异常的最常见原因:

  • 字段名不一致:比如JSON返回filmId,数据类定义为film_id且未添加@SerialName("filmId")注解,导致Ktor无法映射字段。
  • 类型不兼容:JSON中是字符串类型的数字(如"year": "2024"),但数据类用Int接收;或JSON存在null值,数据类字段未标记为可空(?)。
  • 嵌套结构缺失:JSON包含嵌套对象/数组,但数据类未对应定义嵌套的可序列化类。

修复示例:

@Serializable
data class Movie(
    @SerialName("filmId") val filmId: Int,
    @SerialName("nameRu") val nameRu: String?, // 允许字段为null
    @SerialName("year") val year: String? // 若JSON返回字符串类型年份,先用String接收再转换
)

2. JSON响应存在非法格式

日志显示的“正常响应”可能仅指状态码正常,响应体可能存在语法问题:

  • 包含未转义的特殊字符(如字符串内未转义的")、缺失逗号或括号。
  • 带UTF-8 BOM头(部分服务器会返回带BOM的JSON,Ktor默认无法解析)。

验证方法:
在HttpClient中添加拦截器,打印完整响应文本后用JSON校验工具检查:

val client = HttpClient(OkHttp) {
    install(ContentNegotiation) { Json() }
    HttpResponseValidator {
        validateResponse { response ->
            val fullBody = response.bodyAsText()
            println("完整响应体:$fullBody")
        }
    }
}

3. Ktor序列化配置缺失关键参数

默认Json配置对格式要求严格,需开启宽松模式适配非标准JSON:

install(ContentNegotiation) {
    Json(Json {
        ignoreUnknownKeys = true // 忽略JSON中数据类未定义的字段
        isLenient = true // 允许单引号、尾随逗号等非标准格式
        coerceInputValues = true // 将无效值转为默认值(如null转0)
    })
}

4. 响应编码问题

若服务器返回的编码不是UTF-8,会导致解析乱码触发异常,需指定对应编码:

val body = response.bodyAsText(Charsets.ISO_8859_1) // 根据实际编码调整

补充建议

提供完整的异常栈信息(尤其是Caused by部分),通常会指向具体的解析失败位置(如某行某列的非法字符),能更快定位问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 19:17:14