IgnoreUnknownKeys 仅适用于 Kotlinx 和 Ktor 的一种类型
IgnoreUnknownKeys for one type only with Kotlinx and Ktor
我在 Ktor 应用程序中使用 Kotlinx 序列化,并寻找 Jacksons @JsonIgnoreProperties(ignoreUnknown = true)
注释的等价物。我知道
install(ContentNegotiation) {
json(Json{ ignoreUnknownKeys = true })
}
我有一些 类 注释 @Serializable
。有没有办法将 ignoreUnknownKeys 仅应用于一种类型 class/type,就像我可以对 Jackson 做的那样?
您可以使用以下技巧:
- 保留
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 }))
}
})
}
我在 Ktor 应用程序中使用 Kotlinx 序列化,并寻找 Jacksons @JsonIgnoreProperties(ignoreUnknown = true)
注释的等价物。我知道
install(ContentNegotiation) {
json(Json{ ignoreUnknownKeys = true })
}
我有一些 类 注释 @Serializable
。有没有办法将 ignoreUnknownKeys 仅应用于一种类型 class/type,就像我可以对 Jackson 做的那样?
您可以使用以下技巧:
- 保留
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 }))
}
})
}