在我的Android应用程序中,我返回了一个简单的JSON对象,其中包含简单的键值对,例如:
{"username" : "billySmith", "gender" : 1}
具有相应字段名username
和gender
(分别为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中的值分配给枚举中的相应字段。
答案 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类,包含username
和gender
字段:
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);