LoginSignup
26
22

More than 5 years have passed since last update.

Gsonでenumをいい感じに処理する

Last updated at Posted at 2014-10-11

javaのenum型をgsonでシリアライズ/デシリアライズする方法の紹介です

TL;DR

  • ordinalの値は要素の追加や宣言の順番で変化してしまうので注意
  • インスタンス変数として保持させたidを利用してデシリアライズを行う
  • Gsonにenum用のJsonDeserializerをかませてインスタンスを作る

まずenumを作成します。
Enum#ordinalで序数がとれるので、この値を使って(デ)シリアライズするのがスマートな感じがしますが、
この値は要素の宣言順序などによって値が変化してしまう(らしい)ので利用するのは危険です。
そこでインスタンスフィールドを用意して各要素にユニークなidを振ります。
今回必要なメソッドは自分のidを返すメソッド(#getId)とidから要素を取得するスタティックなメソッドです(#fromId)


public enum Platform {

    Twitter(0), TwitterDM(1);

    int id;

    Platform(int id) {
        this.id = id;
    }

    public int getId() {
        return this.id;
    }

    public static Platform fromId(int id) {
        for (Platform type : Platform.values()) {
            if (type.getId() == id) {
                return type;
            }
        }
        return null;
    }

}

次にDeserializerを作ります。
Deserializerは値をintで受け取ってEnumに変換するだけです。


public class PlatformDeserializer implements JsonDeserializer<Platform> {

    @Override
    public Platform deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
            throws JsonParseException {
        int id = json.getAsInt();
        return Platform.fromId(id);
    }
}

あとはGsonBuilderで先ほどのDeserializerを登録してgsonのインスタンスを作ればenumを変換することが出来るようになります。 便利!!

GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(Platform.class, new PlatformDeserializer());
gson = gsonBuilder.create();
26
22
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
22