从Jackson序列化中的数组中删除空的JSON对象

问题描述 投票:0回答:1

我在Java Pojo类中有一个列表。该列表包含一些MyChildPojo对象,这些对象不是null,但是可以具有带有null值的属性。示例:

MyChildPojo obj1 = new MyChildPojo();
MyChildPojo obj2 = new MyChildPojo();

我在MyChildPojo类上添加了@JsonInclude(JsonInclude.Include.NON_EMPTY),因此在序列化对象时不会添加null属性。现在,我对List对象的最终序列化输出是:

[
  {}, {}
]

在这种情况下,我想删除完整的List对象。我尝试通过在List对象上添加@JsonInclude(JsonInclude.Include.NON_EMPTY)@JsonInclude(value = Include.NON_EMPTY, content = Include.NON_EMPTY),但仍获得相同的输出。

我只能在我的情况下使用注释。有什么可行的方法吗?

java serialization jackson json-deserialization jackson2
1个回答
0
投票

您可以使用带有自定义过滤器的注释来执行此操作。当整个MyChildPojo对象的集合只是外壳程序时,您可以在自定义过滤器中完全省略list属性。

用[注释MyChildPojo

@JsonInclude(value = JsonInclude.Include.NON_EMPTY, valueFilter = EmptyListFilter.class)
public class MyChildPojo {
...
}

并定义EmptyListFilter,如下所示

public class EmptyListFilter {
    @Override
    public boolean equals(Object obj) {
        if (obj == null || !(obj instanceof List)) {return false;}
        Optional<Object> result = ((List)obj).stream().filter(
                eachObj -> Arrays.asList(eachObj.getClass().getDeclaredFields()).stream().filter(eachField -> {
                    try {
                        eachField.setAccessible(true);
                        if ( eachField.get(eachObj)  != null && !eachField.get(eachObj).toString().isEmpty()) {
                            return true;
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    return false;
                }).count() > 0).findAny();
       return  !result.isPresent();
    }
}

示例对Java:8使用以下依赖项>>

   compile group: 'com.fasterxml.jackson.core', name: 'jackson-annotations', version: '2.11.0'
   compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.9.4'
© www.soinside.com 2019 - 2024. All rights reserved.