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

时间:2019-03-07 21:32:37

标签: java json jackson jackson-databind

我正在尝试使用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捕获的已知密钥,此解决方案就可以很好地工作。如果未在three

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

2 个答案:

答案 0 :(得分:2)

您需要启用READ_UNKNOWN_ENUM_VALUES_AS_NULL上默认禁用的ObjectMapper

ObjectMapper mapper = new ObjectMapper();
mapper.enable(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL);

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

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

private EnumMap<MyEnum, MyPojo> foo;

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

另请参阅:

答案 1 :(得分:0)

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

spring.jackson.deserialization.READ_UNKNOWN_ENUM_VALUES_AS_NULL=true