tengo una enumeración:GSON-Case para no sensible Enum Deserialización
enum Type {
LIVE, UPCOMING, REPLAY
}
Y algunos JSON:
{
"type": "live"
}
y una clase:
class Event {
Type type;
}
Cuando trato de deserializar el JSON, usando GSON, recibo null
para el campo de tipo Event
, ya que el caso del campo de tipo en el JSON no coincide con el de la enumeración.
Events events = new Gson().fromJson(json, Event.class);
Si cambio de la enumeración a la siguiente, entonces todo funciona bien:
enum Type {
live, upcoming, replay
}
Sin embargo, me gustaría dejar las constantes de enumeración como mayúsculas.
Supongo que tengo que escribir un adaptador, pero no he encontrado ninguna buena documentación o ejemplos.
¿Cuál es la mejor solución?
Editar:
que era capaz de conseguir un trabajo JsonDeserializer. Sin embargo, hay una forma más genérica de escribir esto, ya que sería desafortunado tener que escribir esto cada vez que exista una desajuste entre los valores enum y las cadenas 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());
}
}
Observe que el código anterior _serializa_ un valor de Enum minúscula y _deserializes_ correctamente solo para las coincidencias exactas de los valores en minúscula. Para realizar una deserialización insensible a las mayúsculas y minúsculas, modifique el método read(): 'return lowercaseToConstant.get (toLowercase (reader.nextString()))'. Y para serializar usando la caja original, modifique el método write(): 'out.value (value.toString())'. – nivs