如何让 Jackson 使用 Kotlin 默认参数来处理缺失值?

问题描述 投票:0回答:1

我有一个如下所示的 Kotlin 数据类,

data class SomeData(
   private val notInJson: String = "some default value",
   private val inJson: String
)

和一个 json 字符串,我希望反序列化为此类的实例 -

{
    "inJson" : "value"
}

当我尝试反序列化此数据时,出现参数

notInJson
不能为空的错误。似乎 Jackson 正在为其传递 null 值,因为它在 json 字符串中丢失。

有没有办法让 Jackson 不为其传递任何值,以便可以使用类定义中指定的默认值?

--编辑--

我确实使用映射器注册了 KotlinModule()。使用版本 2.7.8 或所有涉及的 jackson 软件包。

以下代码-

@Test fun jackson_kotlin_module() {
    val mapper = ObjectMapper().registerModule(KotlinModule())
    println(
        mapper.readValue("""{ "inJson" : "some value" }""",     SomeData::class.java))
}

给了我-

com.fasterxml.jackson.databind.JsonMappingException: Instantiation of [simple 
type, class SomeData] value failed (java.lang.IllegalArgumentException): 
Parameter specified as non-null is null: method SomeData.<init>, parameter 
notInJson
at [Source: { "inJson" : "some value" }; line: 1, column: 27]
json jackson kotlin
1个回答
35
投票

默认参数是 Kotlin 的一项功能。杰克逊不知道这一点,因此我们需要以某种方式通知它才能支持它。值得庆幸的是,有优秀的 jackson-module-kotlin 可以让你做到:

val mapper: ObjectMapper = ObjectMapper()
        .registerKotlinModule() //let Jackson know about Kotlin via extension method
...
data class SomeData(
    private val notInJson: String = "some default value",
    private val inJson: String
)
...
val data = mapper.readValue<SomeData>("""{"inJson": "sample value"}""")
println(data) // -> SomeData(notInJson=some default value, inJson=sample value)

有关如何使用它的说明,请查看 jackson-module-kotlin 自述文件 特别注意模块和 Jackson 本身的版本。为了使默认参数起作用,您至少需要 2.8.4

jackson-module-kotlin 版本
    

© www.soinside.com 2019 - 2024. All rights reserved.