Jackson-在不使用JsonSerializer和BeanSerializerModifier的情况下定义空字段

时间:2018-09-24 11:46:48

标签: java json jackson

我有一个带有很多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。 我读了herehere,说我可以使用JsonSerializer和BeanSerializerModifier做到这一点。

但是,我想知道是否有一种更简洁的方法,而不必为我要处理的每个自定义字段定义一个额外的类。 例如,如果我能以某种方式为我的BOO对象重写并实现一个Jackson isEmpty()方法(实现某些Jackson接口),那就太好了。

有这么简单的方法吗?

编辑:

我希望能够执行以下操作,而不必检查null:

foo.getBoo().getAaa();

谢谢。

2 个答案:

答案 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
    }
}