IgnoreUnknownKeys 仅适用于 Kotlinx 和 Ktor 的一种类型

Posted

技术标签:

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

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

install(ContentNegotiation) 
     json(Json ignoreUnknownKeys = true )
 

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

【问题讨论】:

恐怕只能忽略 format 实例级别的未知键,这是 Ktor 创建的唯一副本 github.com/Kotlin/kotlinx.serialization/blob/master/docs/… 【参考方案1】:

您可以使用以下技巧:

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

【讨论】:

以上是关于IgnoreUnknownKeys 仅适用于 Kotlinx 和 Ktor 的一种类型的主要内容,如果未能解决你的问题,请参考以下文章

WebM 也适用于音频,还是仅适用于视频?

WebRTC connectionState 停留在“new” - 仅适用于 Safari,适用于 Chrome 和 FF

http.ListenAndServe 仅适用于本地主机?

Jquery 动画仅适用于一个元素

为啥缓存行仅适用于 simdization?

nvidia GPU 仅适用于 python2.7