我有一个看起来像这样的Kotlin数据类,
data class SomeData(
private val notInJson: String = "some default value",
private val inJson: String
)
和一个json字符串,我希望反序列化为这个类的一个实例 -
{
"inJson" : "value"
}
当我尝试反序列化此数据时,我收到一个错误,即参数notInJson
不能为空。看起来杰克逊正在为它传递一个空值,因为它在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))
}
给了我 -
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]
答案 0 :(得分:12)
默认参数是Kotlin功能。杰克逊不知道它,因此我们需要以某种方式告知它能够支持它。值得庆幸的是,有这么好的jackson-kotlin-module让你这么做:
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 Readme和特别注意模块的版本和Jackson本身。要使默认参数有效,您需要at least version 2.8.4