gpt4 book ai didi

json - 你如何让 Jackson 使用 Kotlin 默认参数作为缺失值?

转载 作者:IT老高 更新时间:2023-10-28 13:34:02 25 4
gpt4 key购买 nike

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

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

还有一个json字符串,我想反序列化成这个类的一个实例-

{
"inJson" : "value"
}

当我尝试反序列化此数据时,我收到参数 notInJson 不能为空的错误。似乎 jackson 正在为它传递一个空值,因为它在 json 字符串中丢失了。

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

--编辑--

我确实向映射器注册了 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]

最佳答案

默认参数是 Kotlin 的一项功能。 jackson 不知道这件事,因此我们需要以某种方式通知它才能支持它。值得庆幸的是有优秀的jackson-module-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-module-kotlin Readme特别注意模块和 Jackson 本身的版本。为了使默认参数起作用,您需要 at least version 2.8.4jackson-module-kotlin

关于json - 你如何让 Jackson 使用 Kotlin 默认参数作为缺失值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40297407/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com