如果枚举映射键为空或未知,则忽略 JSON 反序列化

Ignore JSON deserialization if enum map key is null or unknown

我正在尝试使用 Jackson 将 JSON 反序列化为 Java POJO。 Json 看起来像

"foo": {
    "one": {
        "a":1,
        "b":"string"
    }
    "three":{
        "a":2
        "b":"another"
    }
    ...
}

我要反序列化的 class 有这个字段:

public class Myclass {

    private Map<MyEnum, MyPojo> foo;

    //setter and getter

    public static MyPojo {
        private int a;
        private String b;
    }
}

我的枚举类型如下所示:

public enum MyEnum {
    one("data1"),two("data2")

    @JsonValue
    String data;

    EnumAttrib(String data) {
       this.data = data;
    }

    private static Map<String, MyEnum> ENUM_MAP = new HashMap();
    static {
        for (MyEnum a: MyEnum.values()) {
            ENUM_MAP.put(a.data, a);
        }
    }
    @JsonCreator
    public static MyEnum fromData(String string) {
        return ENUM_MAP.get(string);
    }
}

只要我们 JSON 拥有由 MyEnum 捕获的已知密钥,此解决方案就可以很好地工作。如果未在 MyEnum

中定义,如何从序列化中跳过某些 JSON 元素(在此示例中为“three”)

您需要启用 READ_UNKNOWN_ENUM_VALUES_AS_NULL,在 ObjectMapper:

上默认禁用
ObjectMapper mapper = new ObjectMapper();
mapper.enable(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL);

执行此操作时,结果 Map 将包含一个条目,其键等于 null,值设置为 JSON 与未知字段之一相关的对象。如果不可接受,您需要编写自定义反序列化程序或在反序列化过程后删除 null 密钥。

要在 Map 中使用 null 键解决问题,您还可以在 POJO 中使用 EnumMap:

private EnumMap<MyEnum, MyPojo> foo;

其中 null 键是不允许的,将被跳过。

另请参阅:

  • Jackson deserializing into Map with an Enum Key, POJO Value

为了解决您的需求,如果您使用 Spring Boot,请将其添加到您的 application.properties:

spring.jackson.deserialization.READ_UNKNOWN_ENUM_VALUES_AS_NULL=true