Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/206.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
在Android Java中使用枚举从服务响应反序列化对象_Java_Android_Enums_Deserialization - Fatal编程技术网

在Android Java中使用枚举从服务响应反序列化对象

在Android Java中使用枚举从服务响应反序列化对象,java,android,enums,deserialization,Java,Android,Enums,Deserialization,我在Enums.java类中获得了一个enum方法,如下所示: public enum Country { @SerializedName("Germany") Germany, @SerializedName("Australia") Australia, @SerializedName("Canada") Canada; @Override public String toString() { retu

我在
Enums.java
类中获得了一个enum方法,如下所示:

public enum Country
{
    @SerializedName("Germany")
    Germany,
    @SerializedName("Australia")
    Australia,
    @SerializedName("Canada")
    Canada;

    @Override
    public String toString()
    {
        return super.toString();
    }
}
@SerializedName("CountryName")
private Enums.Country countryName;

...
get
set
然后,我得到了一个对象,它的属性之一是
Enums.Country
,如下所示:

public enum Country
{
    @SerializedName("Germany")
    Germany,
    @SerializedName("Australia")
    Australia,
    @SerializedName("Canada")
    Canada;

    @Override
    public String toString()
    {
        return super.toString();
    }
}
@SerializedName("CountryName")
private Enums.Country countryName;

...
get
set
基本上,国家名称来自服务呼叫。然而,目前该对象仅涉及3个国家,即德国、澳大利亚和加拿大。如果它是其他内容,则它将为空。我怎样才能避免呢


谢谢。

这相对容易,只需在类中定义一个未知的值,如下所示:

public enum Country
{
    Unknown(Unknown"),
    @SerializedName("Germany")
    Germany,
    @SerializedName("Australia")
    Australia,
    @SerializedName("Canada")
    Canada;
}
JsonDeserializer<Country> deserializer = new JsonDeserializer<Country>() {
    @Override
    public Country deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        try {
            return Country.valueOf(json.getAsString());
        } catch (Exception e){
            return Country.Unknown;
        }
    }
};
然后为该
Enum
类型编写一个自定义反序列化程序,并使用它解析该
Enum
。例如,使用GSON的反序列化程序代码如下所示:

public enum Country
{
    Unknown(Unknown"),
    @SerializedName("Germany")
    Germany,
    @SerializedName("Australia")
    Australia,
    @SerializedName("Canada")
    Canada;
}
JsonDeserializer<Country> deserializer = new JsonDeserializer<Country>() {
    @Override
    public Country deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        try {
            return Country.valueOf(json.getAsString());
        } catch (Exception e){
            return Country.Unknown;
        }
    }
};
JsonDeserializer反序列化程序=新的JsonDeserializer(){
@凌驾
公共国家/地区反序列化(JsonElement json,类型typeOfT,JsonDeserializationContext)引发JsonParseException{
试一试{
返回Country.valueOf(json.getAsString());
}捕获(例外e){
返回国。未知;
}
}
};

您的
toString()
完全没有意义。您的
国家/地区
枚举与
枚举有何关系。总体验证状态类型
?从您向我们展示的内容来看,这两段代码互不相关。对不起,请检查我编辑的代码。它应该是Enums.country在这种特定情况下,正确的解决方案不是首先将国家名称硬连接到应用程序中。使用数据库表。明天一场革命,可能会有两个新国家和一个前国家。这不是硬编码的东西。如果你觉得有必要,把它们都放进去。现在,还有一些情况,你有固定的项目,比如身份证,你只允许驾驶执照,护照或出生证。但是有些地方也有国籍卡,这不在上面的列表中。所以我需要一个名为Unknown的字段在Country类中?