【问题标题】:Kotlinx Serialization MissingFieldExceptionKotlinx 序列化 MissingFieldException
【发布时间】:2021-02-24 01:04:24
【问题描述】:

我正在使用 Ktor 从 Moshi 转换为 kotlinx 序列化,当我尝试请求获取数据时出现此错误

kotlinx.serialization.MissingFieldException: 字段“附件”是 必填,但没找到

这是有道理的,因为此特定响应不包含此字段

响应 Json

{
    "data": {
        "id": "1299418846990921728",
        "text": "This is a test"
    }
}

但是我的 Serialized 类的 attachments 字段可以为空(它仅在需要时才出现在响应中)所以它应该忽略它,我认为它与 Moshi 一样

@Serializable
data class ResponseData(
    val id: Long
    val attachments: Attachments?,
    val author_id: String?,
    val text: String
}

在我的 Ktor 客户端设置中,我将其设置为忽略未知键

private val _client: HttpClient = HttpClient(engine) {
    install(JsonFeature) {
        val json = Json {
            this.isLenient = true
            this.ignoreUnknownKeys = true
        }
        serializer = KotlinxSerializer(json)
    }
}

为什么即使它可以为空,它仍然说该字段是必需的?

【问题讨论】:

    标签: ktor kotlinx.serialization


    【解决方案1】:

    我想通了,显然,即使您将某些内容标记为可为空的,它仍然认为是必需的。

    要让它真正成为可选的,你需要给它一个默认值,例如数据类看起来像这样带有可空值

    @Serializable
    data class ResponseData(
        val id: Long
        val attachments: Attachments? = null,
        val author_id: String? = null,
        val text: String
    }
    

    一旦你设置了值,这些字段就变成了可选的并且不会抛出异常

    【讨论】:

    • 我仍然收到此错误,我已经尝试了所有建议...
    【解决方案2】:

    从 v1.3.0 开始,您可以配置 Json 功能以将缺少的字段视为 null,使用 explicitNulls = false

    install(JsonFeature) {
        serializer = KotlinxSerializer(
            json = kotlinx.serialization.json.Json {
                explicitNulls = false
            }
        )
    }
    

    explicitNulls 的文档:

    指定空值是否应该为可空属性编码,并且在解码期间必须存在于 JSON 对象中。 当这个标志被禁用时,没有默认值的具有空值的属性不会被编码;在解码期间,对于没有默认值的可空属性,没有字段值将被视为 null。 默认为真。

    【讨论】:

    猜你喜欢
    • 2020-12-05
    • 2020-02-08
    • 2019-12-31
    • 1970-01-01
    • 1970-01-01
    • 2019-06-17
    • 2021-05-14
    • 1970-01-01
    • 2020-02-15
    相关资源
    最近更新 更多