Ho un enum:GSON non-Case Sensitive Enum deserializzazione
enum Type {
LIVE, UPCOMING, REPLAY
}
E alcuni JSON:
{
"type": "live"
}
e una classe:
class Event {
Type type;
}
Quando provo a deserializzare il JSON, utilizzando GSON, ricevo null
per il campo di tipo Event
, poiché il caso del campo tipo in JSON non corrisponde a quello dell'enum.
Events events = new Gson().fromJson(json, Event.class);
Se cambio l'enum al seguente, poi tutto funziona benissimo:
enum Type {
live, upcoming, replay
}
Tuttavia, vorrei lasciare le costanti enum come tutte le lettere maiuscole.
Suppongo di dover scrivere un adattatore, ma non ho trovato alcuna documentazione o esempi validi.
Qual è la soluzione migliore?
Edit:
sono stato in grado di ottenere un JsonDeserializer lavoro. C'è un modo più generico per scrivere questo, anche se sarebbe spiacevole doverlo scrivere ogni volta che c'è un caso di mis-match tra i valori enum e le stringhe 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());
}
}
Si noti che il codice precedente _serializza_ un valore Enum in lettere minuscole e _deserializes_ correttamente solo per le corrispondenze esatte dei valori in lettere minuscole. Per eseguire la deserializzazione senza distinzione tra maiuscole e minuscole, modificare il metodo read(): 'return lowercaseToConstant.get (toLowercase (reader.nextString()))'. E per serializzare usando il caso originale, modificare il metodo write(): 'out.value (value.toString())'. – nivs