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

