Десериализация нулевого значения для перечисления с Джексоном - PullRequest
1 голос
/ 06 апреля 2020

У меня проблема с десериализацией JSON и отображением в enum. Я получаю JSON от внешнего API-интерфейса к этим двум примерам:

{
 "someValue": null
}
{
 "someValue": "exists"
}

Я хотел бы сопоставить нулевые значения с некоторым значением по умолчанию перечисления.

Объект модели

SomeEnum someValue;

и перечислимый класс

public enum SomeEnum {
    @JsonProperty("exists") EXISTS,
    NONE;
}

Для существует, класс модели значений содержит правильное перечисление, но если я получу null из API, он все равно будет null в модели.

Я пытался создать какой-нибудь метод, аннотированный @JsonCreator, создавая собственный десериализатор enum, используя @JsonEnumDefaultValue, но ни одно из этих решений не помогло мне. Кто-нибудь знает, как я могу десериализовать нули до некоторого enum по умолчанию?

Ответы [ 2 ]

0 голосов
/ 06 апреля 2020

Хорошо, сейчас я решил эту проблему, создав собственный десериализатор enum.

class SomeEnumDeserializer extends StdDeserializer<SomeEnum> {
    SomeEnumDeserializer() {
        super(SomeEnum.class);
    }

    @Override
    public SomeEnum getNullValue(DeserializationContext ctxt) {
        return SomeEnum.NONE;
    }

    @Override
    public SomeEnum deserialize(JsonParser p, DeserializationContext ctxt) {
        // implementation here
    }

и зарегистрировав его с помощью @JsonDeserialize:

@JsonDeserialize(using = SomeEnumDeserializer.class)
public enum SomeEnum {
// code
}

Но все же я бы предпочел использовать что-то вроде @JsonProperty, но для нуля, например @JsonNullProperty или что-то вроде этого.

0 голосов
/ 06 апреля 2020

(Честно говоря, я написал этот код здесь, не тестируя его, может быть, вам нужно немного его изменить)

Вы можете попробовать сделать что-то вроде следующего (Enum с конструктором и использовать @JsonCreator ):

public enum SomeEnum {
    EXISTS("exists"),
    NONE(null);

    private String value;

    SomeEnum (String value) {
        this.value = value;
    }

    @JsonCreator
    public static SomeEnum fromValue(String value) {
        for (SomeEnum someEnum : SomeEnum.values()) {
            if (StringUtils.equalsIgnoreCase(someEnum.getValue(), value)) {
                return someEnum;
            }
        }
        throw new IllegalArgumentException("Unknown value " + value);
    }

    public String getValue () {
        return value;
    }
}

Если это не сработает, сохраните приведенное выше перечисление и попробуйте сделать пользовательский конвертер (без Джексона) следующим образом

При использовании пружинной загрузки Вам следует положить это связующее в вашем контроллере

@InitBinder
public void initBinder(final WebDataBinder webdataBinder) {
    webdataBinder.registerCustomEditor(SomeEnum.class, new SomeEnumConverter());
}

Ниже приведен пользовательский конвертер для указания способа преобразования входного значения в значение перечисления.

public class SomeEnumConverter extends PropertyEditorSupport {
    @Override
    public void setAsText(final String text) {
        setValue(SomeEnum.fromValue(text));
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...