繁体   English   中英

将JSON解析为枚举字段

[英]Parsing JSON to Enum Fields

在我的Android应用程序中,我返回了带有简单键值对的简单JSON对象,例如:

{"username" : "billySmith", "gender" : 1}

还有一个带有相应字段名称usernamegender (分别为String和int)的枚举。

我正在尝试使用Gson解析JSON对象,并用json值填充枚举字段。 我不确定如何将GSON与枚举一起使用。 我对一个对象的实例应设置为等于gson.fromJson(jsonObect, instanceType.class);的概念很熟悉gson.fromJson(jsonObect, instanceType.class);

为了添加更多细节,我使用了枚举,以便可以从我的android项目中的任何地方检索值。

if (response.getStatusLine().getStatusCode() == 200 && result != "")
{                               
    GlobalEnum globalEnum = GlobalEnum.getInstance();
    Gson gson = new GsonBuilder().create();
    globalEnum = gson.fromJson(result, GlobalEnum.class);
}

其中“结果”是HTTP响应的实体的字符串表示形式

GlobalEnum代码段:

public enum GlobalEnum
{
    INSTANCE;

    private String username;
    private int gender;

    public static GlobalEnum getInstance()
    {
        return INSTANCE;
    }

    public int getGender()
    {
        return gender;
    }

    public void setGender(int gender)
    {
        this.gender = gender;
    }
}

*编辑:改写:我有一个枚举,并且我有一个jsonObject。 枚举和JSON对象都具有“用户名”和“性别”。 使用Gson,我想解析JSON对象,以便将JSONobject中的值分配给Enum中的各个字段。

正如我在评论中所说,您需要创建一个类型适配器,以便能够在json解析期间获取您的枚举。 这是我为自己的目的所做的一个例子。 在您的枚举中,如下创建TypeAdapterFactory gsonTypeAdaptor

public static TypeAdapterFactory gsonTypeAdaptor = new TypeAdapterFactory() {
        @Override
        public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
            Class<T> rawType = (Class<T>) type.getRawType();
            if (!(rawType.isEnum() && Predicates.assignableFrom(rawType).apply(<your enum>.class))) {
                return null;
            }
            return new TypeAdapter<T>() {
                public void write(JsonWriter out, T value) throws IOException {
                    if (value == null) {
                        out.nullValue();
                    } else {
                        out.value(((<your enum>)value).name);
                    }
                }
                public T read(JsonReader reader) throws IOException {
                    if (reader.peek() == JsonToken.NULL) {
                        reader.nextNull();
                        return null;
                    } else {
                        return (T) <get your enum by using reader.nextString()>;
                    }
                }
            };
        }
    };

一个适配器就位,向您的gson builder注册,如下所示: builder.registerTypeAdapterFactory(<your enum>.gsonTypeAdaptor);

让我知道这是否有用。

您可能误解了Java中的Enum的含义。 通常不应在运行时对它们进行修改,例如这样。

我想以下逻辑将为您提供更好的服务,将JSON解析为Enums时免于这种麻烦。

首先,一个UserInformation Java Bean类,包装usernamegender字段:

public class UserInformation
{
    private String username;
    private int gender;

    public UserInformation(String username, int gender)
    {
        this.username = username;
        this.gender = gender;
    }

    public String getUsername()
    {
        return username;
    }
    public void setUsername(String username)
    {
        this.username = username;
    }
    public int getGender()
    {
        return gender;
    }
    public void setGender(int gender)
    {
        this.gender = gender;
    }
}

然后,将您的GlobalEnum类重命名为GlobalValues并进行修改以用作值容器:

public abstract class GlobalValues
{
    // You can also create get/set methods for encapsulation if you want
    public static UserInformation userInformation;
}

然后是将JSON字符串解析为UserInformation对象,然后将其存储在GlobalValues类上的逻辑。

String jsonStr = "{\"username\" : \"billySmith\", \"gender\" : 1}";

Gson gson = new Gson();

GlobalValues.userInformation = gson.fromJson(jsonStr, UserInformation.class);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM