java - 如何使用 Jackson 排除空列表项

标签 java json jackson deserialization feign

我正在调用一个 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_NULLDeserializationFeature.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/

相关文章:

json - Q : Correct way posting JSON from Reactstrap form

java - 无法使用 java 显示来自 URL 的 json 数据

java - JSON -> 不可变的自定义 Java 对象。 JSON 中的数据不足

JavaFX 8 : Adding a Custom CSS File Via class. getResource() 错误

Javascript:将 JSON 数组转换为级联 JSON

java - java hashcode()面试题

java - 将JSON反序列化为通用映射,强制将所有JSON float 转换为Decimal或String,在Jackson中

java - 使用 Jackson 和 Mockito 序列化对象时的无限递归

Java 实例位置

java - 从android中的Java main获取(String[] args)