Json 格森。enum和int的解决方法
我从服务器上得到一个json应答。我正在用GSON库解析它 json中的键有一个整数值。在不更改服务器答案的情况下(这是外部服务器接口,我们对其没有影响),是否可以将整数值强制转换为枚举 多谢各位 UPD: json响应。注意:我们无法更改它Json 格森。enum和int的解决方法,json,gson,Json,Gson,我从服务器上得到一个json应答。我正在用GSON库解析它 json中的键有一个整数值。在不更改服务器答案的情况下(这是外部服务器接口,我们对其没有影响),是否可以将整数值强制转换为枚举 多谢各位 UPD: json响应。注意:我们无法更改它 "testObject":{ "id":123, "type":42 } 枚举: public enum ObjectTypeEnum { UNKNOWN_TYPE(0), SIMPLE_TYPE(11), COMPLEX_TYP
"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;
}
通过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);
}
}
我是新来的,所以我不知道如何补充穆尔·沃特马上面的答案,只是一个小小的更正
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(ObjectTypeEnum.class, new ObjectTypeDeserializer() );
Gson gson = gsonBuilder.create();
注;您需要用括号为gsonBuilder提供类的实例
除此之外,回答得很好!您只需使用@SerializedName注释即可确定将哪些值序列化到导线或从导线中序列化。那么您就不需要编写自定义的TypeAdapter了
import com.google.gson.annotations.SerializedName;
公共枚举对象类型枚举{
@序列化名称(“0”)
未知的_类型(0),
@序列化名称(“11”)
简单_型(11),
@SerialziedName(“42”)
复合型(42);
私有int值;
私有ObjectTypeEnum(int值){
这个值=值;
}
public int getValue(){
返回值;
}
}
如果不需要在代码中获取导线值,可以删除“值”字段和相关代码
public enum ObjectTypeEnum {
@SerializedName("0")
UNKNOWN_TYPE,
@SerializedName("11")
SIMPLE_TYPE,
@SerialziedName("42")
COMPLEX_TYPE;
}
根据琼斯的回答,以下是科特林的翻译:
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
}
我编辑了你的代码,因为它不太正确。但是“感谢您的编辑!在同行评审之前,此编辑仅对您可见。”问题在于关键是int而不是string。而且没有key()方法。我添加了public int key(){return key;}哦,是的,很抱歉,我从ide中获得了“gease”,并将其合并到op的代码中,接受它。您能展示一下JSON字符串的示例吗?或者您可以引用以下内容:kjones-使用@SerializedName将返回字符串形式的值,而不是int形式的值。请注意此解决方案。当您将同一个枚举写入连接时,它将把值序列化为字符串而不是数字。如果您不知道
未知类型的序列化名称的值,请删除@SerializedName(“0”)
。
enum class ObjectTypeEnum(val value:Int) {
@SerializedName("0")
UNKNOWN_TYPE(0),
@SerializedName("11")
SIMPLE_TYPE(11),
@SerializedName("42")
COMPLEX_TYPE(42)
}
enum class ObjectTypeEnum {
@SerializedName("0")
UNKNOWN_TYPE,
@SerializedName("11")
SIMPLE_TYPE,
@SerializedName("42")
COMPLEX_TYPE
}