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 的一种类型的主要内容,如果未能解决你的问题,请参考以下文章
WebRTC connectionState 停留在“new” - 仅适用于 Safari,适用于 Chrome 和 FF