2016-04-19 3 views
4

Моя цель - разобрать JSON-файл или его часть на класс Enum в Java. Я могу сделать это легко, но по причинам отладки я хотел бы также включить значение по умолчанию.Deserialize JSON с использованием GSON для Enum

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

Так что, если я пытаюсь разобрать этот JSON (с помощью класса-оболочки):

{enum: "buttons"} 

Я хотел бы получить MyEnum.BUTTONS, но если я пытаюсь разобрать:

{enum: "divider"} 

Я бы все равно нравится знать ценность. Я хотел бы отобразить все значения (например, «делитель», «строка», «цвет», ...) до DEFAULT (сохранение строки, отображаемой в значение DEFAULT). Можно ли сохранить значение «разделитель» до MyEnum.DEFAULT?

+0

Непонятно, чего вы пытаетесь достичь. Имеет ли 'MyEnum.DEFAULT' только одно сериализованное значение,« разделитель »? Или вы хотите сопоставить каждую нераспознанную строку с '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 всегда имеет последнее значение в глобальной области видимости, поэтому я бы не рекомендовал этот подход, если его использовать более широко, чем отладка, и, честно говоря, я не ожидал, что другой программист поймет, почему я это написал.

Однако, если вы извлекаете сериализованные формы своих перечислений из определения перечисления, то в вашем десериализаторе вам нужно реализовать переключатель, который решает, какое перечисление следует десериализовать. Если вы также отделите свой код отладки и вызовите его из десериализатора, вам больше не нужна сериализованная форма в вашем перечислении. Кроме того, вы разделяете разную функциональность - Single Responsibility Principle.

Остальная опция - использование класса, отличного от enum, поэтому вы можете создавать новые объекты во время десериализации.

Смежные вопросы