java - jackson JSON 序列化 : How to ignore a nested object when all its fields are null?

标签 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;
    }
}

我试图忽略所有为 null 或空的字段,但效果很好。但我也想忽略字段全部为 null 或空的对象。例如:

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

生成的 JSON 字符串是 {"name":"John Doe","child":{},"sibling":{}},但我希望它是 { “姓名”:“李四”ChildSibling 需要在创建 Person 时进行初始化,所以我不想更改它。有没有办法让 jackson 使用自定义序列化程序将具有空字段的对象视为空?我看过为特定类型的对象使用自定义序列化器的示例,但我需要一个适用于任何对象的序列化器。

最佳答案

您可以通过一种可以说更简单的方式实现这一点,无需为 PersonChildSibling 使用自定义序列化程序,但使用 CUSTOM 包含字段类型并将其作为过滤器传递。

首先为ChildSibling 定义正确的equals 方法。然后,要过滤等于其默认构造函数返回值的嵌套对象,请在 Person 中注释相关的 getter,如下所示:

@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;
}

valueFilter 设置为上面的 Child.class 具有使用默认构造函数创建对象的效果 Child emptyChild = new Child() 和然后决定另一个对象 Child child 应该被序列化检查 emptyChild.equals(child) 是否为 false

docs for valueFilter

关于java - jackson JSON 序列化 : How to ignore a nested object when all its fields are null?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50008338/

相关文章:

java - Wagner Fischer算法在java中的实现

javascript - 在 HTML5 中显示嵌套的不等长 JSON 数组

java - 如何将 json 字符串列表转换为 java 中的一个 JsonNode/Object

Android - 使用 Retrofit 获取错误 "Cannot construct instance of (although at least one create exist)"

java - google-api-translate-java 检索翻译时出错

java - Spring Data MongoDB NotLike - 不支持的关键字

java - 在浏览器中显示来自字节数组的图像

Python 通过 JSON 迭代数据

java - 字符 android 处的 JSON 未终止对象

scala - sbt 中的 Jackson 版本 : 2. 7.1 不兼容?