Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 格森。enum和int的解决方法_Json_Gson - Fatal编程技术网

Json 格森。enum和int的解决方法

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

我从服务器上得到一个json应答。我正在用GSON库解析它

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

多谢各位

UPD:

json响应。注意:我们无法更改它

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