json 序列化期间字段的包含/排除

tkclm6bt  于 2023-02-26  发布在  其他
关注(0)|答案(1)|浏览(119)

我在上POJO课,

class Test {
   @JsonInclude(JsonInclude.Include.NON_EMPTY)
   Mgmt mgmt;

}

class Mgmt {
   @JsonInclude(JsonInclude.Include.NON_EMPTY)
   List<String> values;
}

在测试序列化期间,“管理”字段将作为管理:尽管使用了“NON_EMPTY”包含条件,{}仍被写出。我希望避免字段管理:{},如果管理类-〉值具有空列表。

7eumitmz

7eumitmz1#

这是因为JsonInclude.Include.NON_EMPTY的默认实现只理解标准数据类型(集合、字符串...)的“空”,而不理解像Mgmt这样的自定义数据类型。
因为这是你的类,所以只有你知道“空”(或“空”)的意思,在你的特定情况下,空是由它的一个属性(List<String> values)本身为空的事实给出的。
要实现这一点,您可以为Mgmt空定义一个自定义过滤器(这是一个简单的类,您可以在其中重写equals方法,使其在每次您希望从序列化Json中过滤出该示例时返回true

class MgmtFilter {

    @Override
    public boolean equals(Object obj) {
        if (!(obj instanceof Mgmt)) {
            return true; //<-- not an instance of Mgmt so we filter it out
        }
        return ((Mgmt) obj).values.isEmpty(); //<-- if the list is empty, we return true (meaning we filter it out)
    }
}

...然后将此类与自定义include一起使用:

class Test {
    @JsonInclude(value = JsonInclude.Include.CUSTOM, valueFilter = MgmtFilter.class)
    Mgmt mgmt;
}

相关问题