[英]Parsing JSON to Enum Fields
在我的Android应用程序中,我返回了带有简单键值对的简单JSON对象,例如:
{"username" : "billySmith", "gender" : 1}
还有一个带有相应字段名称username
和gender
(分别为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类,包装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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.