2016-04-19 15 views
4

Mein Ziel ist es, eine JSON-Datei oder einen Teil davon zu einer Enum-Klasse in Java zu analysieren. Ich kann es leicht machen, aber aus Gründen der Fehlersuche möchte ich auch einen Standardwert hinzufügen.Deserialize JSON mit GSON zu Enum

public enum MyEnum { 
    @SerializedName("texts") 
    TEXTS, 
    @SerializedName("buttons") 
    BUTTONS, 
    @SerializedName("inputs") 
    INPUTS, 
    DEFAULT 
} 

Also, wenn ich versuche, diese JSON zu analysieren (eine Wrapper-Klasse):

{enum: "buttons"} 

würde ich MyEnum.BUTTONS bekommen, aber wenn ich zu analysieren versuchen:

{enum: "divider"} 

würde ich möchte immer noch den Wert wissen. Ich möchte alle Werte (z. B. "Teiler", "Linie", "Farbe", ...) auf DEFAULT abbilden (wobei der String beibehalten wird, der dem Wert DEFAULT zugeordnet wurde). Wäre es möglich, Wert "Teiler" zu MyEnum.DEFAULT Eigenschaft zu speichern?

+0

Es ist nicht klar, was Sie erreichen möchten. Hat 'MyEnum.DEFAULT' nur einen serialisierten Wert," divider "? Oder möchten Sie jede nicht erkannte Zeichenfolge auf 'DEFAULT' abbilden? – Timmos

+0

Custom (de) Serializer ist wahrscheinlich eine Option, siehe Handbuch –

+0

meine letzte Änderung – urgas9

Antwort

0

Implementieren Sie eine benutzerdefinierte JsonDeserializer und installieren Sie sie mit GsonBuilder.registerTypeAdapter. Ihre Enum-Implementierung könnte dann wie folgt umgesetzt werden:

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

Die Umsetzung Ihrer Deserializer (und Serializer auch) verwendet dann die mapFrom Methode Ihrer ENUM. Der Nebeneffekt ist, dass die DEFAULT Instanz immer den neuesten Wert in einem globalen Gültigkeitsbereich hat, also würde ich diesen Ansatz nicht empfehlen, wenn er breiter als Debugging verwendet wird, und um ehrlich zu sein, würde ich nicht erwarten, dass ein anderer Programmierer versteht, warum ich das geschrieben habe.

Wenn Sie jedoch die serialisierten Formulare Ihrer Enums aus der Enum-Definition extrahieren, müssen Sie in Ihrem Deserializer einen Schalter implementieren, der entscheidet, in welche Enumeration die Deserialisierung erfolgen soll. Wenn Sie auch Ihren Debugging-Code trennen und ihn von Ihrem Deserializer aus aufrufen, benötigen Sie das serialisierte Formular in Ihrem Enum nicht mehr. Außerdem trennen Sie verschiedene Funktionen - die Single Responsibility Principle.

Die einzige andere verbleibende Option ist die Verwendung einer Nicht-Enum-Klasse, sodass Sie neue Objekte nach der Deserialisierungszeit instanziieren können.