У меня есть перечисление:GSON Non-Case Sensitive Enum Десериализация
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
}
Однако, я хотел бы оставить константы перечислений в верхнем регистре.
Я предполагаю, что мне нужно написать адаптер, но не нашли никакой хорошей документации или примеров.
Какое оптимальное решение?
Edit:
Я был в состоянии получить JsonDeserializer работает. Есть ли более общий способ написать это, хотя, как было бы жаль, что нужно писать это каждый раз, когда есть случай неправильного совпадения значений enum и строк 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());
}
}
Обратите внимание, что приведенный выше код _serializes_ значение нижнего регистра и _deserializes_ правильно выполняется только для точных совпадений нижнего регистра. Чтобы выполнить десериализацию, не учитывающую регистр, измените метод read(): 'return lowercaseToConstant.get (toLowercase (reader.nextString())). И для сериализации с использованием оригинального случая измените метод write(): 'out.value (value.toString())'. – nivs