Используя JSON-B/Yasson, есть ли способ игнорировать регистр перечислений при десериализации?
public class MyObject{
MyEnum condition;
//getters and setters
}
public enum MyEnum{
NEW, OLD, REFURBISHED;
}
часть входящего JSON: "condition" : "new"
Проблема в том, что входящий JSON использует перечисления в нижнем регистре.




Я не думаю, что это должно быть доступно из коробки. Поскольку технически вы можете иметь как 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()));
Я согласен, что это не должно быть поведением по умолчанию. По умолчанию он должен быть чувствителен к регистру.