2016-04-19 19 views
4

私の目標は、JSONファイルまたはその一部をJavaのEnumクラスに解析することです。私はそれを簡単に行うことができますが、デバッグの理由から私はデフォルト値も含めたいと思います。GSONをEnumに使用してJSONを逆シリアル化する

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

私は(ラッパークラスを使用して)このJSONを解析しようとした場合:

{enum: "buttons"} 

私はMyEnum.BUTTONSになるだろうが、私は解析しようとした場合:

{enum: "divider"} 

私は考えそれでも価値を知りたい。私はDEFAULTの値にマップされた文字列を維持して、すべての値(例えば、 "divider"、 "line"、 "color"、...)をDEFAULTにマッピングしたいと思います。値 "divider"をMyEnum.DEFAULTプロパティに保存することは可能でしょうか?

+0

達成しようとしていることは明確ではありません。 'MyEnum.DEFAULT'にはシリアル化された値" divider "しかありませんか?または認識できないすべての文字列を 'DEFAULT'にマップしますか? – Timmos

+0

カスタム(デ)シリアライザはおそらくオプションです。マニュアルを参照してください –

+0

私の最新の編集を確認してください – urgas9

答えて

0

カスタム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のインスタンスが常にグローバルスコープ上で最新の値を持つため、デバッグより幅広く使用する場合はこの方法をお勧めしません。正直なところ私はこれを書いた理由を別のプログラマが理解するとは思わないでしょう。

ただし、enum定義から列挙型のシリアル化された形式を抽出する場合は、デシリアライザでデシリアライズする列挙型を決定するスイッチを実装する必要があります。デバッグコードを分離してデシリアライザから呼び出す場合は、enumにシリアライズされたフォームは必要ありません。さらに、さまざまな機能を分離しています - Single Responsibility Principle

残りのオプションは、非enumクラスを使用しているため、非直列化時に新しいオブジェクトをインスタンス化できます。

関連する問題