Перечисления для @JsonProperty Джексона

Скажем, у меня есть перечисление:

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 - это com.fasterxml.jackson.annotation.JsonProperty, версия 2.8.0)

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

Какую ценность вы хотите сохранить в DTO.something? "admin"?

ernest_k 17.05.2018 11:02

Я обновил свой вопрос. Я хочу сохранить значение поля «admin» из json, чтобы сделать DTO.something = "superuser".

htshame 17.05.2018 11:03

Для меня это не имеет смысла ... Как это перечисление подходит в этом контексте?

cassiomolin 17.05.2018 11:11

Извини, что ввела тебя в заблуждение. Суть моего вопроса была немного другой. Я обновил вопрос, надеюсь, теперь он имеет больше смысла

htshame 17.05.2018 11:55

@baao нет, не будет. The value must be constant.

htshame 17.05.2018 11:59

Да, думал, что это тоже так

baao 17.05.2018 12:00

Возможный дубликат Как предоставить значение аннотации из константы java

Ryan The Leach 17.05.2018 12:03
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
7
3 038
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

JSON немного странный в том смысле, что {"admin": "superuser"} был бы более понятным, если бы он был похож на {"role": "superuser"} (или userType вместо роли). Однако, чтобы сопоставить значение с перечислением, все, что вам нужно сделать, это указать его в своем DTO. Для вашего json и перечисления, содержащего также 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.

Извини, что ввела тебя в заблуждение. Суть моего вопроса была немного другой. Я обновил вопрос, надеюсь, теперь он имеет больше смысла

htshame 17.05.2018 11:55
Ответ принят как подходящий

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

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;

Это работает, потому что JsonProperty требует строки времени компиляции. Java позволяет аннотации принимать перечисления во время компиляции, но только если они принимают необходимый тип. Хотя он не отвечает на вопрос OP напрямую, это может быть решением. Мне все еще интересно увидеть решение, которое, вероятно, потребовало бы специальной аннотации Джексона, которая принимает перечисление правильного типа.

Ryan The Leach 17.05.2018 12:08

@htshame, если вы используете константу, вам вообще нужно перечисление?

Ryan The Leach 17.05.2018 12:09

@RyanTheLeach Мне нужно перечисление, потому что я использую эту константу во многих местах, и есть много похожих констант. И главное, что эти константы будут время от времени изменяться в связи с новыми требованиями. Думаю, это решение идеально подходит для моих нужд.

htshame 17.05.2018 12:12

Другие вопросы по теме