关于json:您如何使Jackson使用缺失值的Kotlin默认参数?

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"
}

尝试反序列化此数据时,出现错误,指出参数notInJson不能为null。 好像Jackson传递了一个null值,因为它在json字符串中丢失了。

有没有办法让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版本2.8.4