gpt4 book ai didi

kotlin - jackson 会忽略不是 bool 值但名称以 “is”开头的数据类字段

转载 作者:行者123 更新时间:2023-12-02 13:19:37 27 4
gpt4 key购买 nike

我在我的项目中使用Jackson with Kotlin binding。我们有一个数据类,其字段类型为Map<A, B>,并被命名为“isRecommended”。当Jackson序列化数据类时,此字段将在结果JSON字符串中省略。

重现相同行为的简单测试:

class FooKotlin {
@Test
fun testFoo() {
println(jacksonObjectMapper().writeValueAsString(Foo1(true)))
println(jacksonObjectMapper().writeValueAsString(Foo2(1)))
println(jacksonObjectMapper().writeValueAsString(Foo3("true")))
}
}

data class Foo1(val isFoo: Boolean)
data class Foo2(val isFoo: Int)
data class Foo3(val isFoo: String)

控制台打印:
{"foo":true}
{}
{}

当我反编译Kotlin字节码时,除了字段的类型外,这三个类的内容似乎几乎相同。那么, jackson 这种行为的原因是什么呢?

最佳答案

如@chrsblck所述,它与jackson-module-kotlin issue #80有关

在版本2.10.1上,虽然序列化的属性名称不同(“is”前缀未删除),但它是不可复制的:

{"isFoo":true}
{"isFoo":1}
{"isFoo":"true"}

在早期版本中,可以使用 JsonProperty注释解决此问题:
data class Foo1(val isFoo: Boolean)
data class Foo2(@get:JsonProperty("foo") val isFoo: Int)
data class Foo3(@get:JsonProperty("foo") val isFoo: String)
{"foo":true}
{"foo":1}
{"foo":"true"}

从技术上讲,将非 bool(boolean) 属性命名为“isSomthing”是不正确的,并且违反了JavaBeans规范。 Jackson依赖JavaBeans约定,因此感到困惑。

如果您可以避免这样的命名,我建议您这样做。否则,从Java代码调用Foo *类时可能会遇到相同的问题。

关于kotlin - jackson 会忽略不是 bool 值但名称以 “is”开头的数据类字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59608443/

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