[英]Deserialize JSON using GSON to Enum
我的目標是將JSON文件或其中的一部分解析為Java中的Enum類。 我可以輕松地做到這一點,但出於調試原因,我想包括一個默認值。
public enum MyEnum {
@SerializedName("texts")
TEXTS,
@SerializedName("buttons")
BUTTONS,
@SerializedName("inputs")
INPUTS,
DEFAULT
}
所以,如果我嘗試解析這個JSON(使用包裝類):
{enum: "buttons"}
我會得到MyEnum.BUTTONS
,但如果我嘗試解析:
{enum: "divider"}
我仍然想知道它的價值。 我想將所有值(例如“divider”,“line”,“color”,...)映射到DEFAULT
(保持映射到DEFAULT
值的String)。 是否可以將值“divider”保存到MyEnum.DEFAULT
屬性?
實現自定義JsonDeserializer並使用GsonBuilder.registerTypeAdapter安裝它。 然后可以按如下方式實現您的枚舉實現:
public enum MyEnum {
TEXTS ("texts"),
BUTTONS("buttons"),
INPUTS("inputs"),
DEFAULT(null);
private String text;
private MyEnum (String text) {
this.text = text;
}
public String getValue () {
return text;
}
public static MyEnum mapFrom (String serialized) {
if (serialized == null) {
DEFAULT.text = null;
return DEFAULT;
}
for (MyEnum inst : MyEnum.values()) {
if (serialized.equals(inst.getValue())) {
return inst;
}
}
DEFAULT.text = serialized;
return DEFAULT;
}
}
然后,您的反序列化器(以及序列化器)的實現將使用枚舉的mapFrom
方法。 副作用是DEFAULT
實例總是在全局范圍內具有最新值,所以如果使用比調試更廣泛的話我不推薦這種方法,說實話我不希望其他程序員理解為什么我寫這個。
但是,如果從枚舉定義中提取枚舉的序列化形式,那么在反序列化器中,您需要實現一個開關來決定要反序列化的枚舉。 如果您還將調試代碼分開並從反序列化器中調用它,則不再需要枚舉中的序列化表單。 此外,您將不同的功能分開 - 單一責任原則 。
剩下的唯一選擇是使用非枚舉類,因此您可以在反序列化時實例化新對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.