Игнорировать десериализацию JSON, если ключ карты enum имеет значение null или неизвестен

Я пытаюсь десериализовать JSON в Java POJO, используя Jackson. Json выглядит так

"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. Как я могу пропустить определенные элементы JSON из сериализации (в этом примере «three»), если они не определены в MyEnum


person Kid F    schedule 07.03.2019    source источник
comment
может быть что-то вроде этого stackoverflow.com/questions/16446619/   -  person Deadpool    schedule 08.03.2019


Ответы (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 не разрешены и будут пропущены.

Смотрите также:

person Michał Ziober    schedule 07.03.2019

Чтобы выполнить ваше требование, если вы используете Spring Boot, добавьте это в свой application.properties:

spring.jackson.deserialization.READ_UNKNOWN_ENUM_VALUES_AS_NULL=true
person yglodt    schedule 25.06.2019