GSON。 enum和int的解决方法

时间:2011-09-12 08:03:27

标签: json gson

我从服务器获得json答案。我正在用GSON-library解析它。

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

谢谢。

UPD:

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

"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 个答案:

答案 0 :(得分:19)

您可以使用@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;
    }
}

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

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

    @SerializedName("11")
    SIMPLE_TYPE,

    @SerialziedName("42")
    COMPLEX_TYPE;
}

答案 1 :(得分:12)

使用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);
    }
}

并按以下方式创建了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

答案 2 :(得分:4)

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

答案 3 :(得分:4)

我是SO的新手所以我不知道如何添加Mur Votema上面的答案,只是一个小小的修正;

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

请注意;你需要括号来为gsonBuilder提供类的实例。

除此之外,还有很好的答案!完全是我正在寻找的。

答案 4 :(得分:0)

从kjones的答案来看,这是科特林的翻译:

val array1 = arrayOf(
        arrayOf(1, 2, 3, 4),
        arrayOf(5, 6, 7, 8),
        arrayOf(9, 10, 11, 12)
)

val array2 = arrayOf(
        arrayOf(11, 12, 13, 14),
        arrayOf(15, 16, 17, 18),
        arrayOf(19, 20, 21, 22)
)

val array3 = arrayOf(
        arrayOf(21, 22, 23, 24),
        arrayOf(25, 26, 27, 28),
        arrayOf(29, 30, 31, 32)
)
val arrays = arrayOf(array1, array2, array3)

val arrayLength = array1.size
val subArrayLength = array1[0].size 
val result = Array(arrayLength * subArrayLength) { index ->
    arrays.map{ it[index / subArrayLength][index % subArrayLength] }.toTypedArray()
}

或者,不需要Int值:

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