簡體   English   中英

使用GSON將JSON反序列化為Enum

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM