top of page

[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;

}

}

參考連結

bottom of page