将JSON解析为枚举字段

时间:2014-01-14 14:21:28

标签: java android json enums gson

在我的Android应用程序中,我返回了一个简单的JSON对象,其中包含简单的键值对,例如:

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

具有相应字段名usernamegender(分别为String和int)的枚举。

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

要添加更多细节,我正在使用Enums,以便可以从我的android项目中的任何位置检索这些值。

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

其中“result”是HTTP Response实体的字符串表示

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

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

2 个答案:

答案 0 :(得分:1)

正如我在评论中所说,你需要创建一个类型适配器,以便能够在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);

请告诉我这是否有用。

答案 1 :(得分:0)

您可能误解了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);