我需要序列化/反序列化特定枚举:
public enum Status {
ONLINE("online"),
OFFLINE("offline"),
UNKNOWN("del") {
@Override
public String getStatusOld() {
return "off";
}
};
private final String name;
Status(String name) {
this.name = name;
}
public String getStatusOld() {
return name;
}
public String toString() {
return name;
}
public static Status typeOf(String name) {
if (!StringUtils.isEmpty(name)) {
for (Status type : values()) {
if (type.name.equalsIgnoreCase(name)) {
return type;
}
if (type.getStatusOld().equalsIgnoreCase(name)) {
return type;
}
}
}
throw new IllegalArgumentException("Unknown status type: " + name);
}
}
public class User {
public String name;
public Status status;
...
}
public class GsonStatusEnumSerializer implements JsonSerializer<Status> {
@Override
public JsonElement serialize(Status status, Type type, JsonSerializationContext jsonSerializationContext) {
return new JsonPrimitive(status.toString());
}
}
public class GsonStatusEnumDeserializer implements JsonDeserializer<Status> {
@Override
public Status deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException {
if (jsonElement != null && jsonElement.isJsonPrimitive()) {
final String status = jsonElement.getAsString();
if (StringUtils.isNotBlank(status)) {
return Status.typeOf(status);
}
}
return null;
}
}
public static void main(String[] args) {
for (Status value : Status.values()) {
System.out.println("class = " + value.getClass() + ", value = " + value);
}
}
class = class com.test.Status, value = online
class = class com.test.Status$2, value = del
class = class com.test.Status, value = offline
public static void main(String[] args) {
Gson gson = new GsonBuilder()
.registerTypeAdapter(Status.class, new GsonStatusEnumDeserializer())
.registerTypeAdapter(Status.class, new GsonStatusEnumSerializer())
.create();
User user = new User();
user.name = "John";
user.status = Status.UNKNOWN;
String json = gson.toJson(user);
User user1 = gson.fromJson(json, User.class);
}
我有个例外:
Exception in thread "main" java.lang.IllegalArgumentException: Unknown process type: UNKNOWN
at com.test.Status.typeOf(Status.java:97)
at com.test.GsonStatusEnumDeserializer.deserialize(GsonStatusEnumDeserializer.java:22)
at com.test.GsonStatusEnumDeserializer.deserialize(GsonStatusEnumDeserializer.java:16)
我如何通过GSON序列化/反序列化它?
我已经找到了解决方案,我必须为这个类型单独添加一个序列化程序。
public static void main(String[] args) {
Gson gson = new GsonBuilder()
.registerTypeAdapter(Status.class, new GsonStatusEnumDeserializer())
.registerTypeAdapter(Status.class, new GsonStatusEnumSerializer())
.registerTypeAdapter(Status.UNKNOWN.getClass(), new GsonStatusEnumSerializer())
.create();
User user = new User();
user.name = "John";
user.status = Status.UNKNOWN;
String json = gson.toJson(user);
User user1 = gson.fromJson(json, User.class);
}
我不喜欢这种方法,但它对我很管用。
问题内容: 我如何使用gson 2.2.4序列化和反序列化一个简单的枚举? 问题答案: 根据 GsonAPI文档 ,Gson提供了的默认序列化/反序列化,因此基本上,应使用标准和方法(与其他类型一样)对序列化和反序列化。
如何用gson 2.2.4序列化和反序列化像这样的简单枚举?
我使用的是JAVA 1.6和Jackson 1.9.9我有一个枚举 我添加了一个@jsonValue,这似乎完成了它将对象序列化为:
问题内容: 我正在使用JAVA 1.6和Jackson 1.9.9我有一个枚举 我添加了一个@JsonValue,这似乎可以将对象序列化为: 但是当我尝试反序列化时,我得到了 我在这里想念什么? 问题答案: 如果你希望将枚举类与其JSON表示完全脱钩,则@xbakesx指出的序列化器/反序列化器解决方案是一个很好的解决方案。 另外,如果你喜欢一个独立的解决方案,则基于·和·注释的实现会更方便。 因
我需要序列化/反序列化一个POJO包含一个特殊枚举(不是字符串的枚举)。我找到了很多字符串枚举的示例,但不是我的情况。 而不是: {“代码”:“20”,“消息”:“无效的URL参数值”,“说明”:“缺少应用程序标识符”} 编辑1 但我的结果是: 现在,我希望将改为
问题内容: 我想通过Google Gson传输列表对象,但是我不知道如何反序列化泛型类型。 看了这个之后我尝试了什么(BalusC的答案): 但是后来我在日食中遇到了一个错误,说“新的List(){}类型必须实现继承的抽象方法…”,如果我使用快速修复方法,则会得到20个以上的方法存根的怪物。 我很确定有一个更简单的解决方案,但是我似乎找不到它! 编辑: 我现在有 但是,我确实在“ fromJson