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

How to prevent Jackson from (de)serializing certain properties?

对于任何 Kotlin 类,都会为格式 componentX() 中的每个 public 属性生成一个方法,因此此类:

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 感到困惑,因为它将每个 componentX() 方法 每个 getXxx() 方法视为(反)序列化目标。

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

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

除了自定义 serializer/deserializer 看看@JsonFilter。它可以使用 mixin 应用,您可以使用自定义逻辑,例如过滤掉所有以 componentX 开头的属性。

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

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

编辑:另请参阅 http://wiki.fasterxml.com/JacksonJsonViews。这更像是一种定义可以忽略的属性的静态方法,所以我认为这对您不起作用,过滤器可能更好。

注意: 不需要接受答案中描述的@JsonFilter的详细信息

不需要 Jackson 的默认行为。使用当前和最近的 Jackson 版本没有描述的这种行为。有时 Google 显示打包为 org.codehaus.* 而不是 com.fasterxml.*

的旧版本

在 Jackson 中,如果 属性 看起来不像 JavaBean 属性,则不会反序列化。而且 componentX 看起来不像 JavaBean 属性。

这是一个测试用例,证明使用原始 Jackson 以及它与 Jackson Module for Kotlin 结合使用都按预期工作,并且都没有这个问题。

class WhosebugTest {
    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 的 none 有这个问题是因为这些都已经与 Kotlin 一起使用了很长时间。