Jackson JSON序列化:当所有字段为空时,如何忽略嵌套对象?

时间:2018-04-24 18:13:31

标签: java json jackson

我使用Jackson并且我有一些JSON模式对象设置如下:

@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class Person {

    String name;
    Child child = new Child();
    Sibling sibling = new Sibling();

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    public Child getChild() {
        return child;
    }
    public void setChild(Child child) {
        this.child = child;
    }

    public Sibling getSibling() {
        return sibling;
    }
    public void setSibling(Sibling sibling) {
        this.sibling = sibling;
    }
}

@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class Child {

    String name;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class Sibling {

    String name;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

我试图忽略所有空或空的字段,这样可以正常工作。但我也想忽略具有全部为空或空的字段的对象。例如:

Person person = new Person();
person.setName("John Doe");
ObjectMapper mapper = new ObjectMapper();
String json = objectMapper.writeValueAsString(person);

生成的JSON字符串为{"name":"John Doe","child":{},"sibling":{}},但我希望它为{"name":"John Doe"}。创建Child时需要初始化SiblingPerson,因此我不想更改它。有没有办法让Jackson使用自定义序列化程序将空字段对象视为null?我已经看到了为特定类型的对象使用自定义序列化器的示例,但我需要一个适用于任何对象的示例。

1 个答案:

答案 0 :(得分:1)

如果没有PersonChildSibling的自定义序列化程序,但CUSTOM包含并传递了equals的类型,您可以用更简单的方式实现此目的字段作为过滤器。

首先为ChildSibling定义正确的Person方法。然后,要过滤与其默认构造函数将返回的嵌套对象相同的嵌套对象,请在@JsonInclude(value = JsonInclude.Include.CUSTOM, valueFilter = Child.class) public Child getChild() { return child; } @JsonInclude(value = JsonInclude.Include.CUSTOM, valueFilter = Sibling.class) public Sibling getSibling() { return sibling; } 中注释相关的getter,如下所示:

valueFilter

Child.class设置为Child emptyChild = new Child()具有使用默认构造函数Child child创建对象的效果,然后决定应该序列化另一个对象emptyChild.equals(child)来检查{ {1}}是假的

docs for valueFilter