Kotlin Jackson忽略非';t布尔值,但名称以“开始”;是";
我正在我的项目中使用。我们有一个数据类,它的字段类型为Kotlin Jackson忽略非';t布尔值,但名称以“开始”;是";,kotlin,jackson,Kotlin,Jackson,我正在我的项目中使用。我们有一个数据类,它的字段类型为Map,名为“isRecommended”。当Jackson序列化数据类时,结果JSON字符串中会忽略此字段 复制相同行为的简单测试: class FooKotlin { @Test fun testFoo() { println(jacksonObjectMapper().writeValueAsString(Foo1(true))) println(jacksonObjectMapper()
Map
,名为“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字节码时,这三个类的内容似乎几乎相同,只是字段的类型不同。那么,杰克逊这种行为的原因是什么呢?正如@chrsblck所提到的,它与 在版本2.10.1上,它是不可复制的,尽管序列化属性名称不同(“is”前缀未删除): 在早期版本中,可以使用
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)
从技术上讲,将非布尔属性命名为“isSomthing”是不正确的,并且违反了JavaBeans规范。Jackson依赖于JavaBeans约定,因此它会变得混乱
如果你能避免这样的命名,我建议你这样做。否则,从Java代码调用Foo*类时可能会遇到同样的问题。您有什么版本的
jacksonObjectMapper()
?看起来2.10.1中发布了一个修复程序,请参阅
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"}