Игнорировать регистр enum с JSON-B / Yasson

Используя JSON-B/Yasson, есть ли способ игнорировать регистр перечислений при десериализации?

public class MyObject{
  MyEnum condition;
  //getters and setters
} 
public enum MyEnum{
 NEW, OLD, REFURBISHED;
}

часть входящего JSON: "condition" : "new" Проблема в том, что входящий JSON использует перечисления в нижнем регистре.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
851
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я не думаю, что это должно быть доступно из коробки. Поскольку технически вы можете иметь как old, так и OLD в качестве допустимых значений вашего перечисления, живущих вместе, разрешение стандартного преобразования в верхний регистр может нарушить эквивалентность туда и обратно. Подумайте о сериализации значения MyEnum.old, чтобы получить значение MyEnum.OLD при десериализации.

Однако вы можете заставить такое поведение работать с помощью адаптера.

public static class MyAdapter implements JsonbAdapter<MyEnum, String> {

    @Override
    public String adaptToJson(MyEnum value) {
        return value.name();
    }

    @Override
    public MyEnum adaptFromJson(String s) {
        return MyEnum.valueOf(s.toUpperCase());
    }
}

Затем аннотируйте перечисление с помощью @JsonbTypeAdapter.

@JsonbTypeAdapter(MyAdapter.class)
public enum MyEnum {
    NEW,
    OLD,
    REFURBISHED;
}

В качестве альтернативы вы создаете своего провайдера Jsonb следующим образом.

Jsonb jsonb = JsonbBuilder.create(new JsonbConfig().withAdapters(new MyAdapter()));

Я согласен, что это не должно быть поведением по умолчанию. По умолчанию он должен быть чувствителен к регистру.

Mark W 22.01.2019 16:59

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