我正在调用一个 API,该 API 返回一个值数组,这些值被转换为 List<SomeEnum>
。响应中的某些值不再在枚举中定义。这些值在列表中显示为 null
值。
我想知道是否有办法告诉 jackson (或假装)排除 null
反序列化时列出项目。
我看过@JsonInclude
但这适用于 null
属性而不是 null
Collection 品。
编辑
值显示为 null 的原因是因为选项 DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL
正在使用中。
最佳答案
您可以将 JsonSetter
注释与 Nulls.SKIP 一起使用。请参阅下面的示例:
import com.fasterxml.jackson.annotation.JsonSetter;
import com.fasterxml.jackson.annotation.Nulls;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Arrays;
import java.util.List;
public class JsonApp {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
Work work = new Work();
work.setDays(Arrays.asList(null, Day.Monday, Day.Tuesday, null, Day.Friday, null));
String json = mapper.writeValueAsString(work);
System.out.println(json);
System.out.println(mapper.readValue(json, Work.class));
}
}
enum Day {Monday, Tuesday, Wednesday, Thursday, Friday}
class Work {
private List<Day> days;
public List<Day> getDays() {
return days;
}
@JsonSetter(contentNulls = Nulls.SKIP)
public void setDays(List<Day> days) {
this.days = days;
}
@Override
public String toString() {
return "Created{" +
"days=" + days +
'}';
}
}
上面的代码打印:
{"days":[null,"Monday","Tuesday",null,"Friday",null]}
Created{days=[Monday, Tuesday, Friday]}
编辑
如果您有未知的枚举值,上述解决方案将不起作用。在这种情况下,您应该使用 DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL
或
DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE
功能。一种解决方法是手动过滤 null
-s 中的集合:
public void setDays(List<Day> days) {
this.days = days.stream().filter(Objects::nonNull).collect(Collectors.toList());
}
当然,我们可以实现自定义反序列化器来收集并跳过它,但是......
关于java - 如何使用 Jackson 排除空列表项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57096639/