私が列挙持っている:私は逆シリアル化しようとするとGSON非大文字と小文字を区別する列挙型デシリアライズ
class Event {
Type type;
}
:
enum Type {
LIVE, UPCOMING, REPLAY
}
そして、いくつかのJSON:
{
"type": "live"
}
とクラスをJSONは、GSONを使用して、のEvent
タイプのフィールドを受け取ります。これは、タイプフィールドがJSONはenumのJSONと一致しません。
Events events = new Gson().fromJson(json, Event.class);
私は次のように列挙型を変更する場合は、すべてが正常に動作します:
enum Type {
live, upcoming, replay
}
しかし、私はすべて大文字としてenum定数を残したいと思います。
私はアダプタを書く必要があると仮定していますが、適切な文書や例は見つかりませんでした。
最適なソリューションは何ですか?
編集:
私は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());
}
}
上記のコードは、小文字のEnum値を_serializes_し、小文字の値と完全に一致する場合にのみ_deserializes_することに注意してください。 大文字と小文字を区別しないデシリアライズを実行するには、read()メソッドを変更します。 'return lowercaseToConstant.get(toLowercase(reader.nextString()))'。 元のケースを使用してシリアル化するには、write()メソッドを変更します。 'out.value(value.toString())'。 – nivs