Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过在Kotlin中传递默认值来反序列化非null类型_Kotlin_Jackson_Deserialization_Jackson Databind - Fatal编程技术网

通过在Kotlin中传递默认值来反序列化非null类型

通过在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

我想使用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.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中有很多字段,我不想对每个字段都使用注释。但当然,这是我在帖子中提出的问题的解决方案。谢谢