簡體   English   中英

如何用傑克遜排除空列表項

[英]How to exclude null list items with Jackson

我正在調用一個API,該API返回將轉換為List<SomeEnum>的值的數組。 響應中的某些值不再在枚舉中定義。 這些值在列表中顯示為null值。

我想知道是否有一種方法可以告訴傑克遜(或假裝)反序列化時排除null列表項。

我看過@JsonInclude但這適用於null屬性而不是null集合項。

編輯

值顯示為null的原因是因為使用了選項DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL

將注釋@JsonInclude(Include.NON_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());
}

當然,我們可以實現用於收集的自定義反序列化器,並在那里跳過它,但是...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM