我从服务器得到一个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)
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
根据 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)
| 归档时间: |
|
| 查看次数: |
13238 次 |
| 最近记录: |