GSON-нечувствительная к регистру десериализация перечисления

У меня есть перечисление:

enum Type {
    LIVE, UPCOMING, REPLAY
}

И немного JSON:

{
    "type": "live"
}

И класс:

class Event {
    Type type;
}

Когда я пытаюсь десериализовать JSON, используя GSON, я получаю null для поля типа Event , поскольку регистр поля типа в JSON не совпадает с регистром перечисления.

Events events = new Gson().fromJson(json, Event.class);

Если я изменю перечисление на следующее, все будет работать нормально:

enum Type {
    live, upcoming, replay
}

Однако я бы хотел оставить константы перечисления заглавными.

Я предполагаю, что мне нужно написать адаптер, но не нашел хорошей документации или примеров.

Какое лучшее решение?


Редактировать:

Мне удалось заставить работать JsonDeserializer. Есть ли более общий способ написать это, так как было бы прискорбно писать это каждый раз, когда возникает несоответствие регистра между значениями перечисления и строками JSON.

protected static class TypeCaseInsensitiveEnumAdapter implements JsonDeserializer<Type> {
    @Override
    public Type deserialize(JsonElement json, java.lang.reflect.Type classOfT, JsonDeserializationContext context)
            throws JsonParseException {         
        return Type.valueOf(json.getAsString().toUpperCase());
    }
}
28
задан Denis Kurochkin 6 August 2019 в 23:54
поделиться