GSON 大文字と小文字を区別しない列挙型デシリアライゼーション 質問する

GSON 大文字と小文字を区別しない列挙型デシリアライゼーション 質問する

列挙型があります:

enum Type {
    LIVE, UPCOMING, REPLAY
}

そしていくつかのJSON:

{
    "type": "live"
}

そしてクラス:

class Event {
    Type type;
}

GSON を使用して JSON を逆シリアル化しようとすると、JSON の type フィールドの大文字と小文字が enum の大文字と小文字と一致しないため、type フィールドnullに対してが返されます。Event

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

enum を次のように変更すると、すべて正常に動作します。

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());
    }
}

ベストアンサー1

私が (今) 見つけたより簡単な方法は、注釈を使うことです。ここ ( ln 195 あたりのクラス)@SerializedNameで見つけました:EnumTest.javaGender

https://code.google.com/p/google-gson/source/browse/trunk/gson/src/test/java/com/google/gson/ functional/EnumTest.java?r=1230 より

これは、すべてのタイプが「大文字と小文字を区別しない」のではなく小文字で入力されることを前提としています。

public enum Type {
    @SerializedName("live")
    LIVE,

    @SerializedName("upcoming")
    UPCOMING,

    @SerializedName("replay")
    REPLAY;
}

これは私が見つけた最もシンプルで一般的な方法です。お役に立てれば幸いです。

おすすめ記事