当前位置: 首页 > 知识库问答 >
问题:

如何使用Jackson排除空列表项

习洲
2023-03-14

我正在调用一个API,它返回一个转换为List的值数组

我想知道是否有办法告诉Jackson(或feign)在反序列化时排除< code>null列表项。

我已经查看了< code>@JsonInclude,但这适用于< code>null属性,而不适用于< code>null集合项。

编辑

值显示为null的原因是因为选项< code >反序列化功能。正在使用READ _ UNKNOWN _ ENUM _ VALUES _ AS _ NULL 。

共有2个答案

苏宏逸
2023-03-14

将注记@JsonInclude(Include.NON_NULL)添加到要映射的类中。这将解决问题

邹华池
2023-03-14

您可以将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功能。一种解决方法是手动过滤来自空值的集合:

public void setDays(List<Day> days) {
    this.days = days.stream().filter(Objects::nonNull).collect(Collectors.toList());
}

当然,我们可以为收集实现自定义反序列化程序并跳过它,但是…

 类似资料:
  • 基本上,我不希望在生成的JSON文件中出现任何空的JSON数组或对象。我已经使用以下方法相应地配置了ObjectMapper: 这适用于数组、集合和字符串。但是,如果我有一个空对象(=所有属性都为null或empty),它仍然会显示在生成的JSON中,如下所示:

  • 问题内容: 我有一个清单,里面有空清单: 如何删除空列表,以便获得: 我尝试了list.remove(’‘),但这不起作用。 问题答案: 尝试 如果您想摆脱所有“虚假”的东西,例如空字符串,空元组,零,您也可以使用

  • 我已经尝试创建自定义序列化程序,但我无法在那里获得字段名。 在GSON中,我使用了,但Jackson没有这样的功能。有对等的吗?

  • 问题内容: 使用Jersey和Jackson创建REST接口,当其中包含0或1个元素时,如何将列表字段序列化为列表。例如: 当bar没有元素时,结果序列化为;当它包含单个元素时,结果序列化为该元素,而不是包含单个元素的数组。有没有办法让它们始终序列化为数组? 作为参考,我使用的是Jersey 1.10和Jackson 1.9.2。 问题答案: 我很确定您实际上并没有使用Jackson(JSON序列

  • 问题内容: 如何将作为地图的属性序列化为地图的值列表?我已经能够使用吸气剂上的注释进行其他简单的转换。但是,我不确定我想做什么。 问题答案: 我们需要类似的东西,在我们的案例中,我们使用了您所评论的自定义项,这很简单: 使用它的代码:

  • 问题内容: 如何摆脱列表项之间的空白?我正在努力使图像彼此相邻。即使我将样式设置为,它们仍然分开。 CSS HTML 问题答案: 2014年9月1日更新 在现代浏览器中,flex-box是执行此操作的首选方法。就像这样简单: 在这里查看JSFiddle 。 对于旧版浏览器的支持,请参考下面的其他选项,尽管稍微复杂一些,但它们仍然不错。 尽管每个其他答案至少提供了一个好的解决方案,但似乎没有一个提供