How do you make Jackson use Kotlin default params for missing values?
我有一个Kotlin数据类,看起来像这样,
1 2 3 4 | data class SomeData( private val notInJson: String ="some default value", private val inJson: String ) |
和一个json字符串,我希望反序列化为此类的一个实例-
1 2 3 | { "inJson" :"value" } |
尝试反序列化此数据时,出现错误,指出参数
有没有办法让Jackson不传递任何值,以便可以使用在类定义中指定的默认值?
- 编辑 -
我确实向映射器注册了KotlinModule()。 使用2.7.8版或涉及的所有杰克逊软件包。
以下代码-
1 2 3 4 5 | @Test fun jackson_kotlin_module() { val mapper = ObjectMapper().registerModule(KotlinModule()) println( mapper.readValue("""{"inJson" :"some value" }""", SomeData::class.java)) } |
给我 -
1 2 3 4 5 | 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的功能。 杰克逊对此一无所知,因此我们需要以某种方式告知它以支持它。 值得庆幸的是,有一个出色的杰克逊·Kotlin模块,让您可以这样做:
1 2 3 4 5 6 7 8 9 10 | 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版本