我使用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
时需要初始化Sibling
和Person
,因此我不想更改它。有没有办法让Jackson使用自定义序列化程序将空字段对象视为null?我已经看到了为特定类型的对象使用自定义序列化器的示例,但我需要一个适用于任何对象的示例。
答案 0 :(得分:1)
如果没有Person
或Child
和Sibling
的自定义序列化程序,但CUSTOM
包含并传递了equals
的类型,您可以用更简单的方式实现此目的字段作为过滤器。
首先为Child
和Sibling
定义正确的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}}是假的