通过在Kotlin中传递默认值来反序列化非null类型
我想使用Kotlin中的自定义反序列化程序反序列化请求模型中的非空字段,如下所示:通过在Kotlin中传递默认值来反序列化非null类型,kotlin,jackson,deserialization,jackson-databind,Kotlin,Jackson,Deserialization,Jackson Databind,我想使用Kotlin中的自定义反序列化程序反序列化请求模型中的非空字段,如下所示: import com.fasterxml.jackson.core.JsonParser import com.fasterxml.jackson.databind.DeserializationContext import com.fasterxml.jackson.databind.JsonNode import com.fasterxml.jackson.databind.deser.std.StdDese
import com.fasterxml.jackson.core.JsonParser
import com.fasterxml.jackson.databind.DeserializationContext
import com.fasterxml.jackson.databind.JsonNode
import com.fasterxml.jackson.databind.deser.std.StdDeserializer
data class MyRequest(val foo: Foo) {
data class Foo(val bar: String)
companion object {
object Deserializer : StdDeserializer<Foo>(Foo::class.java) { //This is added to Jackson Module successfully somewhere else
override fun deserialize(jsonParser: JsonParser?, context: DeserializationContext?): Foo {
val node: JsonNode = jsonParser!!.codec.readTree(jsonParser)
return if (node.isNull || node.isTextual.not()) Foo("default")
else Foo(node.asText())
}
}
}
}
由于
Foo
是非空类型,并且我没有在Foo
的请求正文中传递任何内容,因此在反序列化之前会抛出此消息。我想知道是否有办法处理此异常,例如提供一个默认值并继续执行反序列化步骤。对于版本2.10.0
,您可以:
data class MyDataClass (
@JsonSetter(nulls = Nulls.SKIP)
val defaultParameter:String="some default value",
)
此外,使用的2.8.4
或更高版本,您可以执行以下操作:
val mapper: ObjectMapper = ObjectMapper().registerModule(KotlinModule()) // "inform" Jackson about Kotlin
...
data class MyDataClass(
val defaultParameter:String="some default value",
)
使用的版本
2.10.0
,您可以:
data class MyDataClass (
@JsonSetter(nulls = Nulls.SKIP)
val defaultParameter:String="some default value",
)
此外,使用的2.8.4
或更高版本,您可以执行以下操作:
val mapper: ObjectMapper = ObjectMapper().registerModule(KotlinModule()) // "inform" Jackson about Kotlin
...
data class MyDataClass(
val defaultParameter:String="some default value",
)
我只是通过重写反序列化程序的getNullValue()方法实现了这一点:
object Deserializer : StdDeserializer<Foo>(Foo::class.java) {
override fun deserialize(jsonParser: JsonParser?, context: DeserializationContext?): Foo {
val node: JsonNode = jsonParser!!.codec.readTree(jsonParser)
return if (node.isNull || node.isTextual.not()) Foo("default")
else Foo(node.asText())
}
override fun getNullValue(): Foo {
return Foo("default value")
}
}
对象反序列化器:StdDeserializer(Foo::class.java){
重写有趣的反序列化(jsonParser:jsonParser?,上下文:反序列化上下文?):Foo{
val节点:JsonNode=jsonParser!!.codec.readTree(jsonParser)
返回if(node.isNull | | node.isTextual.not())Foo(“默认值”)
else-Foo(node.asText())
}
重写fun getNullValue():Foo{
返回Foo(“默认值”)
}
}
我通过重写反序列化程序的getNullValue()方法实现了这一点:
object Deserializer : StdDeserializer<Foo>(Foo::class.java) {
override fun deserialize(jsonParser: JsonParser?, context: DeserializationContext?): Foo {
val node: JsonNode = jsonParser!!.codec.readTree(jsonParser)
return if (node.isNull || node.isTextual.not()) Foo("default")
else Foo(node.asText())
}
override fun getNullValue(): Foo {
return Foo("default value")
}
}
对象反序列化器:StdDeserializer(Foo::class.java){
重写有趣的反序列化(jsonParser:jsonParser?,上下文:反序列化上下文?):Foo{
val节点:JsonNode=jsonParser!!.codec.readTree(jsonParser)
返回if(node.isNull | | node.isTextual.not())Foo(“默认值”)
else-Foo(node.asText())
}
重写fun getNullValue():Foo{
返回Foo(“默认值”)
}
}
实际上,在我的请求模型中,
Foo
中有许多字段,我不想对每个字段都使用注释。但当然,这是我在帖子中提出的问题的解决方案。谢谢。实际上,在我的请求模型中,Foo
type中有很多字段,我不想对每个字段都使用注释。但当然,这是我在帖子中提出的问题的解决方案。谢谢