使用Ktor调用API展示名言时遇SerializationException:找不到QuoteResponse类的序列化器
Ktor调用API展示名言时遇SerializationException:找不到QuoteResponse类的序列化器
看起来你碰到了Kotlinx Serialization和Ktor配合时的典型配置问题,我来帮你一步步排查解决:
1. 先确认核心的序列化注解是否加对
最常见的原因就是你的QuoteResponse数据类没有标记@Serializable注解,或者注解加错了地方。请务必确保你的类是这样写的:
import kotlinx.serialization.Serializable @Serializable // 必须加在类声明的上方! data class QuoteResponse( // 这里是你的字段,比如: val quote: String, val author: String )
如果类里有嵌套的自定义类,那嵌套类也需要加@Serializable;如果有不需要序列化的字段,用@Transient标记它。
2. 检查Gradle插件的应用是否完整
你提到在项目级Gradle里加了序列化插件的别名,但很多人会漏掉在模块级Gradle里实际应用这个插件——这是超级常见的坑!
- 项目级
build.gradle.kts里只是声明插件(供模块引用):plugins { alias(libs.plugins.android.application) apply false alias(libs.plugins.kotlin.android) apply false alias(libs.plugins.kotlin.serialization) apply false // 这里是声明,不是应用 } - 必须在模块级的
build.gradle.kts里应用插件:plugins { alias(libs.plugins.android.application) alias(libs.plugins.kotlin.android) alias(libs.plugins.kotlin.serialization) // 关键!在这里实际启用插件 }
3. 验证依赖版本的兼容性
你的versions.toml里的版本看起来是兼容的(Ktor 2.3.4 + Kotlinx Serialization 1.7.3适配Kotlin 1.9.x),但可以再做两个确认:
- 确保项目的Kotlin版本和这些依赖对齐,比如在
versions.toml里统一管理Kotlin版本:[versions] kotlin = "1.9.20" # 和Ktor 2.3.4匹配的版本 ktor = "2.3.4" kotlinx-serialization = "1.7.3" - 检查Ktor的ContentNegotiation配置是否正确,尤其是要允许忽略未知字段(很多API会返回多余字段导致序列化失败):
val client = HttpClient(CIO) { install(ContentNegotiation) { Json { ignoreUnknownKeys = true // 一定要加这个!避免API返回额外字段时出错 isLenient = true prettyPrint = false } } }
4. 清理缓存并重建项目
Gradle的缓存有时候会抽风,导致插件或注解没有生效。执行以下操作试试:
- 点击Android Studio的
Build -> Clean Project - 然后点击
Build -> Rebuild Project - 或者在终端运行
./gradlew clean build(Windows用gradlew.bat clean build)
5. 确认API调用时的类型指定正确
最后,检查你调用API获取响应体的代码,是否明确指定了QuoteResponse类型:
val quoteResponse = client.get("你的名言API地址").body<QuoteResponse>()
不要省略泛型参数,也不要不小心用了其他同名的类(比如不同包下的QuoteResponse)。
按这个顺序排查下来,90%以上的概率能解决你的序列化器找不到的问题。
内容来源于stack exchange
相关产品推荐
相关产品推荐

