我正在使用 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":{}}
,但我希望它是 { “姓名”:“李四”
。 Child
和 Sibling
需要在创建 Person
时进行初始化,所以我不想更改它。有没有办法让 jackson 使用自定义序列化程序将具有空字段的对象视为空?我看过为特定类型的对象使用自定义序列化器的示例,但我需要一个适用于任何对象的序列化器。
最佳答案
您可以通过一种可以说更简单的方式实现这一点,无需为 Person
或 Child
和 Sibling
使用自定义序列化程序,但使用 CUSTOM
包含字段类型并将其作为过滤器传递。
首先为Child
和Sibling
定义正确的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
关于java - jackson JSON 序列化 : How to ignore a nested object when all its fields are null?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50008338/