我从服务器获得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;
}
答案 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提供类的实例。
除此之外,还有很好的答案!完全是我正在寻找的。 p>
答案 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)
}