当前位置: 首页 > 知识库问答 >
问题:

如何序列化/反序列化Gson中的枚举

甄永年
2023-03-14

我需要序列化/反序列化特定枚举:

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序列化/反序列化它?

共有1个答案

仇飞鹏
2023-03-14

我已经找到了解决方案,我必须为这个类型单独添加一个序列化程序。

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指出的序列化器/反序列化器解决方案是一个很好的解决方案。 另外,如果你喜欢一个独立的解决方案,则基于·和·注释的实现会更方便。 因

  • 问题内容: 我想通过Google Gson传输列表对象,但是我不知道如何反序列化泛型类型。 看了这个之后我尝试了什么(BalusC的答案): 但是后来我在日食中遇到了一个错误,说“新的List(){}类型必须实现继承的抽象方法…”,如果我使用快速修复方法,则会得到20个以上的方法存根的怪物。 我很确定有一个更简单的解决方案,但是我似乎找不到它! 编辑: 我现在有 但是,我确实在“ fromJson

  • 问题内容: 由于要执行处理的业务逻辑,因此我正在实现自定义。但是某些部分可以解析为标准方式。这是否可能- 我自己处理一些元素,并让一些嵌套元素自动处理? 这是JSON: 这是项的自定义反序列化器: 现在,我想让GSON解析枚举。我可以自己完成,这只是几行代码,但是我更愿意库做很多。 问题答案: …但是我希望图书馆尽其所能。 好吧,只需使用Gson。 有数据传输对象模式,尤其是Gson映射类,可以完