Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin Jackson忽略非';t布尔值,但名称以“开始”;是";_Kotlin_Jackson - Fatal编程技术网

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