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

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

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

和一个JSON字符串,我想反序列化成这个类的一个实例 –

 { "inJson" : "value" } 

当我试图反序列化这个数据时,我得到一个错误,参数notInJson不能为null。 看起来像杰克逊传递一个空值,因为它是在JSON字符串中缺少。

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

– 编辑 –

我用映射器注册了一个KotlinModule()。 使用版本2.7.8或涉及的所有杰克逊软件包。

以下代码 –

 @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] 

默认参数是一个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) 

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