GSON.Обходной путь для enum и int - PullRequest
       4

GSON.Обходной путь для enum и int

8 голосов
/ 12 сентября 2011

Я получаю JSON-ответ от сервера.И я анализирую его с помощью GSON-библиотеки.

Ключ в json имеет целочисленное значение.Можно ли как-то без изменения ответа сервера (это интерфейс внешнего сервера, мы не имеем на него никакого влияния) преобразовать целочисленное значение в перечисление?

Спасибо.

UPD:

Ответ json.ПРИМЕЧАНИЕ: мы не можем изменить его

"testObject":{
"id":123,
"type":42
}

Перечисление:

public enum ObjectTypeEnum
{
    UNKNOWN_TYPE(0),
    SIMPLE_TYPE(11),
    COMPLEX_TYPE(42);

    private int value;

    private ObjectTypeEnum(int value)
    {
        this.value = value;         
    }

    public static ObjectTypeEnum findByAbbr(int value)
    {
        for (ObjectTypeEnum currEnum : ObjectTypeEnum.values())
        {
            if (currEnum.value == value)
            {
                return currEnum;
            }
        }

        return null;
    }

    public int getValue()
    {
        return value;
    }
}

И класс объекта

public class TestObject
{
    publuc int id;
    public ObjectTypeEnum type; 
}

Ответы [ 5 ]

19 голосов
/ 11 июля 2014

Вы можете просто использовать аннотацию @SerializedName, чтобы определить, какое значение будет сериализовано в / из провода.Тогда вам не нужно писать собственный TypeAdapter.

import com.google.gson.annotations.SerializedName;

public enum ObjectTypeEnum {
    @SerializedName("0")
    UNKNOWN_TYPE(0),

    @SerializedName("11")
    SIMPLE_TYPE(11),

    @SerialziedName("42")
    COMPLEX_TYPE(42);

    private int value;

    private ObjectTypeEnum(int value) {
        this.value = value;         
    }

    public int getValue() {
        return value;
    }
}

Если вам не нужно получать значение проводника в вашем коде, вы можете удалить поле «value» и связанный с ним код.

public enum ObjectTypeEnum {
    @SerializedName("0")
    UNKNOWN_TYPE,

    @SerializedName("11")
    SIMPLE_TYPE,

    @SerialziedName("42")
    COMPLEX_TYPE;
}
12 голосов
/ 12 сентября 2011

Используя ответ Чина и помощь моего напарника, я получаю следующее решение.

Я написал внутренний класс в классе синтаксического анализатора.

private static class ObjectTypeDeserializer implements
        JsonDeserializer<ObjectTypeEnum>
{
    @Override
    public PreconditioningStatusEnum deserialize(JsonElement json,
            Type typeOfT, JsonDeserializationContext ctx)
            throws JsonParseException
    {
        int typeInt = json.getAsInt();
        return ObjectTypeEnum
                .findByAbbr(typeInt);
    }
}

и создал GSON-Object на следующемпуть:

    GsonBuilder gsonBuilder = new GsonBuilder();
    gsonBuilder.registerTypeAdapter(ObjectTypeEnum.class, new ObjectTypeDeserializer() );
    Gson gson = gsonBuilder.create();

http://sites.google.com/site/gson/gson-user-guide#TOC-Custom-Serialization-and-Deserializ

4 голосов
/ 31 мая 2012

Я новичок в SO, поэтому я не знаю, как добавить ответ Мура Вотема выше, но только небольшое исправление;

GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(ObjectTypeEnum.class, new ObjectTypeDeserializer() );
Gson gson = gsonBuilder.create();

Примечание;вам нужны скобки, чтобы предоставить экземпляр класса для gsonBuilder.

Кроме того, отличный ответ!Сделал именно то, что искал.

4 голосов
/ 12 сентября 2011
public enum Color {
    GREEN(1), BLUE(2), RED(3);

    private int key;

    private Color(int key) {
        this.key = key;
    }

    public static Color findByAbbr(int key) {
        for (Color c : values()) {
            if (c.key == key) {
                return c;
            }
        }
        return null;
    }
}
0 голосов
/ 18 мая 2019

Из ответа Кьонеса, вот перевод Котлина:

  enum class ObjectTypeEnum(val value:Int) {
    @SerializedName("0")
    UNKNOWN_TYPE(0),
    @SerializedName("11")
    SIMPLE_TYPE(11),
    @SerializedName("42")
    COMPLEX_TYPE(42)
  }

Или без необходимости значений Int:

  enum class ObjectTypeEnum {
    @SerializedName("0")
    UNKNOWN_TYPE,
    @SerializedName("11")
    SIMPLE_TYPE,
    @SerializedName("42")
    COMPLEX_TYPE
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...