[Java] JSON to Object with Enum
今天工作的時候發生了一個不該犯的錯誤
在撰寫程式的時候對於字串的管理大家不外乎就幾個選擇
1.把字串用成一個變數來管理
2.使用 Enum 來管理
話說小弟我在剛開始寫程式的時候被 Enum 搞慘了
(哀...學生時期玩太兇了, 一進入職場後還債還的很苦)
今天解決這個問題讓我又學到一個新方法
為了防止這次之後會忘記又要花時間上網找答案
所以撰寫這篇來紀錄以防自己忘記
回到正題
今天主要講的重點 : 物件的屬性使用 Enum
首先, 我們來建立一個物件的 domain
public obj1 {
private String x;
private String y;
// 下面的 get 與 set 省略
}
基本上從 Java 的物件導向來說
上面就是一個基本的物件程式碼
這個時候我們就可以使用Gson 將拿到的 Json 字串轉成物件了
再來, 下面是大家耳熟能詳的 Enum
enum Xenum {
X1("1"),
X2("2"),
X3("3");
private String code;
X(String code) {
this.code = code;
}
public String getCode() {
return code;
}
}
這個時候就是這篇的重點啦!
我們將物件的 domain 改成
public obj1 {
private Xenum x;
private String y;
// 下面的 get 與 set 省略
}
當然, 這樣子還是不行的
這樣的話會跳
com.google.gson.JsonParseException: The JsonDeserializer EnumTypeAdapter failed to deserialized json object
接下來有兩種解決方法
第一種比較簡單
在 Enum 增加 Annotation
所以我們的 Enum 就會變成這樣
enum Xenum {
@SerializedName("1")
X1("1"),
@SerializedName("2")
X2("2"),
@SerializedName("3")
X3("3");
private String code;
X(String code) {
this.code = code;
}
public String getCode() {
return code;
}
}
參考連結
第二種就是增加 Adapter
class XenumDeserializer implements JsonDeserializer<Xenum> {
@Override
public Xenum deserialize(JsonElement json, Type typeOfT,
JsonDeserializationContext context)
throws JsonParseException {
Xenum [] scopes = Xenum .values();
for (Xenum scope : scopes) {
if (scope.getCode().equals(json.getAsString()))
return scope;
}
return null;
}
}
參考連結