繁体   English   中英

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

[英]Ignore JSON deserialization if enum map key is null or unknown

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

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

我想反序列化的类具有以下字段:

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 READ_UNKNOWN_ENUM_VALUES_AS_NULL其禁用:

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键是不允许的,将被跳过。

也可以看看:

为了满足您的要求,如果您使用的是Spring Boot ,请将其添加到application.properties中:

spring.jackson.deserialization.READ_UNKNOWN_ENUM_VALUES_AS_NULL=true

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM