【问题标题】:Remove empty JSON objects from an array in Jackson serialization从杰克逊序列化的数组中删除空的 JSON 对象
【发布时间】:2020-09-14 23:36:44
【问题描述】:

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

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

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

[
  {}, {}
]

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

我只能在我的情况下使用注释。有没有办法做到这一点?

【问题讨论】:

  • 这能回答你的问题吗? Don't return property when it's an empty list with jackson。你说的是“只有注解”,但是如果你可以添加一个注解,我想你应该也可以设置WRITE_EMPTY_JSON_ARRAYS属性。
  • 感谢您的建议。它与我的用例非常相似。但就我而言,它是 [{}, {}] 而不是 []。所以它不会起作用。

标签: java serialization jackson json-deserialization jackson2


【解决方案1】:

您可以使用带有自定义过滤器的注释来执行此操作。在自定义过滤器中,当整个 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'

【讨论】:

    猜你喜欢
    • 2013-05-11
    • 2018-03-16
    • 1970-01-01
    • 1970-01-01
    • 2016-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-18
    相关资源
    最近更新 更多