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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 10:50:27