GSON.enum和int的解决方法

Tim*_*ima 10 json gson

我从服务器得到一个json答案.我正在用GSON-library解析它.

json中的键具有整数值.是否可以在不改变服务器答案(它是外部服务器接口,我们对它没有影响)的情况下将整数值转换为枚举?

谢谢.

UPD:

json-Response.注意:我们无法改变它

"testObject":{
"id":123,
"type":42
}
Run Code Online (Sandbox Code Playgroud)

枚举:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

和对象类

public class TestObject
{
    publuc int id;
    public ObjectTypeEnum type; 
}
Run Code Online (Sandbox Code Playgroud)

kjo*_*nes 22

您可以使用@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;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您不需要在代码中获取连线值,则可以删除"值"字段和相关代码.

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

    @SerializedName("11")
    SIMPLE_TYPE,

    @SerialziedName("42")
    COMPLEX_TYPE;
}
Run Code Online (Sandbox Code Playgroud)

  • kjones - 使用@SerializedName将值返回为字符串,而不是int. (9认同)

Tim*_*ima 13

使用Chin的答案和我的同事帮助我得到以下解决方案.

我在解析器类中编写了一个内部类.

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

并按以下方式创建了GSON-Object:

    GsonBuilder gsonBuilder = new GsonBuilder();
    gsonBuilder.registerTypeAdapter(ObjectTypeEnum.class, new ObjectTypeDeserializer() );
    Gson gson = gsonBuilder.create();
Run Code Online (Sandbox Code Playgroud)

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


Cra*_*rag 9

根据 kjones 的回答,这是 Kotlin 翻译:

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

或者,不需要 Int 值:

  enum class ObjectTypeEnum {
    @SerializedName("0")
    UNKNOWN_TYPE,
    @SerializedName("11")
    SIMPLE_TYPE,
    @SerializedName("42")
    COMPLEX_TYPE
  }
Run Code Online (Sandbox Code Playgroud)