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