你如何让杰克逊使用Kotlin默认参数来表示缺失值?

0cd*_*0cd 13 json jackson kotlin

我有一个看起来像这样的Kotlin数据类,

data class SomeData(
   private val notInJson: String = "some default value",
   private val inJson: String
)
Run Code Online (Sandbox Code Playgroud)

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

{
    "inJson" : "value"
}
Run Code Online (Sandbox Code Playgroud)

当我尝试反序列化此数据时,我得到一个错误,该参数notInJson不能为null.看起来杰克逊正在为它传递一个空值,因为它在json字符串中丢失了.

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

- 编辑 -

我用映射器注册了KotlinModule().使用版本2.7.8或所有涉及的jackson包.

以下代码 -

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

给我 -

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]
Run Code Online (Sandbox Code Playgroud)

mie*_*sol 15

默认参数是Kotlin功能.杰克逊不知道它,因此我们需要以某种方式告知它能够支持它.值得庆幸的是,有杰出的jackson-kotlin模块可以让你做到:

val mapper: ObjectMapper = ObjectMapper()
        .registerModule(KotlinModule()) //let Jackson know about Kotlin
...
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)
Run Code Online (Sandbox Code Playgroud)

有关如何使用它的说明,请查看jackson-kotlin模块自述文件,特别注意模块和Jackson本身的版本.为了使默认参数工作,你需要至少版本2.8.4杰克逊科特林模块

  • @PuneetArora你需要注意版本.jackson-kotlin-module 2.8.4支持构造函数和创建者方法的默认参数. (2认同)