从 Jackson 序列化中的数组中删除空 JSON 对象
Remove empty JSON objects from an array in Jackson serialization
我在 Java Pojo class 中有一个列表。该列表包含一些 MyChildPojo 对象,这些对象不是空的,但可以具有空值的属性。示例:
MyChildPojo obj1 = new MyChildPojo();
MyChildPojo obj2 = new MyChildPojo();
我在我的 MyChildPojo class 上添加了 @JsonInclude(JsonInclude.Include.NON_EMPTY)
,因此在序列化对象时不会添加 null 属性。
现在我对 List 对象的最终序列化输出是:
[
{}, {}
]
在这种情况下,我想删除完整的 List 对象。我尝试在 List 对象上添加 @JsonInclude(JsonInclude.Include.NON_EMPTY)
和 @JsonInclude(value = Include.NON_EMPTY, content = Include.NON_EMPTY)
但仍然得到相同的输出。
我只能在我的案例中使用注释。有什么可行的方法吗?
您可以使用带有自定义过滤器的注释来执行此操作。在自定义过滤器中,当整组 MyChildPojo
对象只是 shell.
时,您可以完全省略列表 属性
用
注释MyChildPojo
class
@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'
我在 Java Pojo class 中有一个列表。该列表包含一些 MyChildPojo 对象,这些对象不是空的,但可以具有空值的属性。示例:
MyChildPojo obj1 = new MyChildPojo();
MyChildPojo obj2 = new MyChildPojo();
我在我的 MyChildPojo class 上添加了 @JsonInclude(JsonInclude.Include.NON_EMPTY)
,因此在序列化对象时不会添加 null 属性。
现在我对 List 对象的最终序列化输出是:
[
{}, {}
]
在这种情况下,我想删除完整的 List 对象。我尝试在 List 对象上添加 @JsonInclude(JsonInclude.Include.NON_EMPTY)
和 @JsonInclude(value = Include.NON_EMPTY, content = Include.NON_EMPTY)
但仍然得到相同的输出。
我只能在我的案例中使用注释。有什么可行的方法吗?
您可以使用带有自定义过滤器的注释来执行此操作。在自定义过滤器中,当整组 MyChildPojo
对象只是 shell.
用
注释MyChildPojo
class
@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'