【发布时间】:2021-11-28 07:05:50
【问题描述】:
我需要序列化/反序列化一个特定的枚举:
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);
}
}
我的 POJO 如下所示:
public class User {
public String name;
public Status 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;
}
}
当我尝试序列化我的User 类并且状态具有值UNKNOWN 时,Gson 没有使用我的自定义序列化程序来序列化用户的状态。
我发现它正在发生,因为如果 UNKNOWN 值具有不同的类型。
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
我序列化User POJO的主要方法:
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 对其进行序列化/反序列化?
【问题讨论】:
-
这能回答你的问题吗? serialize and deserialize enum with Gson
-
@Aris 这种方法对我不起作用。我的问题是
Status.UNKNOWN的类型。它具有com.test.Status$2类型,因此 Gson 忽略了我的自定义序列化程序。 -
我看到你注册了 2 个序列化程序。尝试删除 GsonProcessTypeEnumDeserializer 看看是否有效
-
@SusanMustafa 我无法删除我的自定义反序列化程序,因为它破坏了我对其他 Status 枚举值的反序列化过程。