Перечисления для Джексона @JsonProperty - PullRequest
0 голосов
/ 17 мая 2018

Допустим, у меня есть перечисление:

public enum ParameterList {
    FREQUENCY_ID("500");
    ...
    lot's of different constants here
    ...

    private final String param;

    ParameterList(String param) {
        this.param = param;
    }

    @Override
    public String toString() {
        return param;
    }
}

И скажем, у меня есть DTO с полем:

private String frequency;

Допустим, у меня есть JSON:

{"500" : "100Hz"}

Я хочу сопоставить это json с моим dto, поэтому DTO.frequency будет иметь значение поля "500" json (которое будет "100Hz").

Я понимаю, что только значения констант должны использоваться в качестве значений атрибутов, но есть ли какое-то решение, чтобы заставить следующую работу работать?

@JsonProperty(ParameterList.FREQUENCY_ID)
private String frequency;

(@JsonProperty is com.fasterxml.jackson.annotation.JsonProperty, версия 2.8.0)

Идея состоит в том, чтобы минимизировать изменения кода, когда перечисление ParameterList.FREQUENCY_ID будет изменено с "500" на другое значение.

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Вы можете попробовать следующее:

public enum ParameterList {

    FREQUENCY_ID(Constants.FREQUENCY_ID_VALUE);

    private final String value;

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

    @Override
    public String toString() {
        return value;
    }

    public static class Constants {
        public static final String FREQUENCY_ID_VALUE = "500";
    }
}

Тогда используйте:

@JsonProperty(ParameterList.Constants.FREQUENCY_ID_VALUE)
private String frequency;
0 голосов
/ 17 мая 2018

json немного странен в отношении того, что {"admin": "superuser"} было бы более понятно, если бы оно было похоже на {"role": "superuser"} (или userType вместо role).Однако для сопоставления значения с перечислением все, что вам нужно сделать, это указать его в DTO.Для вашего json и enum, содержащего также superuser в качестве значения

public enum UserType {
    ADMIN, SUPERUSER
....
}

, все, что вам нужно сделать, это сделать, чтобы ваш DTO имел перечисление типа

private UserType admin; // <-- admin because that's your key's name (maybe change that)

Обратите внимание, что вытакже можно использовать

@JsonProperty("admin") private UserType userType; // or whatever name you like 

или что-то подобное, если вы не можете изменить JSON.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...