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

时间:2015-01-01 16:58:42

标签: java json jackson kotlin

对于任何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;  }
}

这与杰克逊混淆,因为它将每个componentX()方法每个getXxx()方法视为(反)序列化目标。

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

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

2 个答案:

答案 0 :(得分:1)

除了自定义序列化器/反序列化器之外,还要看看@JsonFilter。它可以使用mixin应用,您可以使用自定义逻辑,例如过滤掉所有以componentX开头的属性。

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

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

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

答案 1 :(得分:0)

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

杰克逊的默认行为不需要任何东西。使用当前和最近的Jackson版本,没有如所描述的这样的行为。有时Google会显示打包为org.codehaus.*而不是com.fasterxml.*

的旧版本

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

这是一个测试案例,证明使用原始Jackson和Jackson Module for 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))
    }
}

我与杰克逊2.6.4进行了测试,但我确信2.5.x2.6.x2.7.x都没有此问题,因为这些问题都与Kotlin一起使用很长一段时间了。