【问题标题】:IgnoreUnknownKeys for one type only with Kotlinx and KtorIgnoreUnknownKeys 仅适用于 Kotlinx 和 Ktor 的一种类型
【发布时间】:2021-06-18 20:49:58
【问题描述】:

我在 Ktor 应用程序中使用 Kotlinx 序列化,并寻找相当于 Jacksons @JsonIgnoreProperties(ignoreUnknown = true) 注释。我知道

install(ContentNegotiation) {
     json(Json{ ignoreUnknownKeys = true })
 }

我有许多类注释为@Serializable。有没有办法只将 ignoreUnknownKeys 应用于一个类型类/类型,就像我可以对 Jackson 做的那样?

【问题讨论】:

标签: kotlin ktor kotlinx


【解决方案1】:

您可以使用以下技巧:

  1. 保留 Json 格式实例的 ignoreUnknownKeys 属性 (false) 的默认值,您将提供给 Ktor。
  2. 对于您希望以特殊方式处理的特定类,请创建额外的自定义序列化程序,这将在后台使用另一个格式实例。
  3. 将这些序列化程序连接到 Json 格式实例,您将提供给 Ktor。

为方便起见,你可以为KSerializer<T>定义如下扩展函数:

fun <T> KSerializer<T>.withJsonFormat(json: Json) : KSerializer<T> = object : KSerializer<T> by this {
    override fun deserialize(decoder: Decoder): T {
        // Cast to JSON-specific interface
        val jsonInput = decoder as? JsonDecoder ?: error("Can be deserialized only by JSON")
        // Read the whole content as JSON
        val originalJson = jsonInput.decodeJsonElement().jsonObject
        return json.decodeFromJsonElement(this@withJsonFormat, originalJson)
    }
}

用法:

install(ContentNegotiation) {
    json(Json {
        serializersModule = SerializersModule {
            contextual(MyDataClass.serializer().withJsonFormat(Json { ignoreUnknownKeys = true }))
        }
    })
}

【讨论】:

    猜你喜欢
    • 2016-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 2014-07-29
    • 2012-12-09
    • 2019-11-16
    相关资源
    最近更新 更多