我有一个带有很多pojo字段的pojo,然后使用Jackson序列化它们。 例如:
@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class FOO {
private BOO boo = new BOO();
private GOO goo = new GOO();
// Getters & setters
}
内部类BOO例如:
@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class BOO {
private AAA aaa = new AAA();
private BBB bbb = new BBB();
// Getters & setters
}
现在,我希望仅当BOO类的所有字段(在我的示例中为aaa,bbb)为null或为空时,才将其序列化为JSON。 我读了here和here,说我可以使用JsonSerializer和BeanSerializerModifier做到这一点。
但是,我想知道是否有一种更简洁的方法,而不必为我要处理的每个自定义字段定义一个额外的类。 例如,如果我能以某种方式为我的BOO对象重写并实现一个Jackson isEmpty()方法(实现某些Jackson接口),那就太好了。
有这么简单的方法吗?
编辑:
我希望能够执行以下操作,而不必检查null:
foo.getBoo().getAaa();
谢谢。
答案 0 :(得分:1)
这很容易用getter方法中的逻辑来完成:
@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class FOO {
private BOO boo = new BOO();
private GOO goo = new GOO();
public BOO getBoo() {
//replace if block with "empty" check logic
if(this.boo.getAaa() == null || this.boo.getBbb() == null) {
return this.boo;
}
return null;
}
}
与@JsonInclude(JsonInclude.Include.NON_EMPTY)
指令结合使用,如果为null,则不会包含该字段。
当然,正如您提到的,您可以将isEmpty()
添加到BOO
并从getter方法调用它。
答案 1 :(得分:1)
您可以通过使用boo
注释来覆盖@JsonGetter
属性的序列化技巧。仅出于示例目的,我简化了模型。
简化的FOO
类:
@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class FOO {
private BOO boo = new BOO();
@JsonGetter("boo")
private BOO serializeEmptyBOO() {
if (this.boo.isEmpty()) {
return this.boo;
}
return null;
}
// Getters & setters
}
简化的BOO
类:
@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class BOO {
@JsonIgnore
public boolean isEmpty() {
// Your isEmpty implementation
}
}