如何防止杰克逊(德)序列化某些属性?

对于任何Kotlin类,以componentX()的格式为每个公共属性生成一个方法,所以这个类:

 public data class Dog(public var name: String, public var age: Double) 

在Java中相当于这样的东西:

 public class Dog { private String name; private double age; public Dog(@NotNull String name, @NotNull double age) { // assign values } // Getters and setters for name and age // toString(), equals(), and hashCode() public String component1() { return name; } public double component2() { return age; } } 

这与Jackson getXxx() ,因为它将每个componentX()方法每个getXxx()方法作为(de)序列化目标进行getXxx()

到目前为止,我一直在解决这个问题的方法是用Java创建我的所有模型,而不是首选。

简而言之,如何配置ObjectMapper,使其忽略componentX()方法?

注意: 在接受的答案中描述的@JsonFilter的细节是不需要的

杰克逊的默认行为没有什么需要。 使用当前和最近的杰克逊版本没有这样的行为,如上所述。 有时Google会显示一个旧版本,它被打包成org.codehaus.*而不是com.fasterxml.*

在杰克逊,如果该属性看起来不像JavaBean属性,则不会被反序列化。 而componentX看起来不像JavaBean的属性。

这是一个测试用例,证明使用原始的杰克逊,也结合杰克逊模块的Kotlin都按预期工作,也没有这个问题。

 class StackOverflowTest { public data class Dog(public var name: String, public var age: Double) @Test public fun testSimpleDeser() { val dogObj = Dog("Avi", 1.5) val expectedJson = """{"name":"Avi","age":1.5}""" assertEquals(expectedJson, ObjectMapper().writeValueAsString(dogObj)) assertEquals(expectedJson, jacksonObjectMapper().writeValueAsString(dogObj)) } } 

我用Jackson 2.6.4进行了测试,但是我相信2.5.x2.6.x2.7.x都没有这个问题,因为现在已经和Kotlin一起使用了很久了。

除了一个自定义的序列化器/反序列化器,看看@JsonFilter。 它可以使用混合应用程序,您可以使用自定义逻辑,如筛选出所有以componentX开头的属性(如果需要)。

这里是解释如何创建自定义过滤器的文档: http : //wiki.fasterxml.com/JacksonFeatureJsonFilter这是非常简单的做。

可能有更好的方法,但这应该工作。

编辑:也看看http://wiki.fasterxml.com/JacksonJsonViews 。 这更多的是定义可以忽略的属性的静态方法,所以我不认为这对你有用,过滤器可能更好。