gpt4 book ai didi

java - 通用枚举 Json 反序列化

转载 作者:行者123 更新时间:2023-11-30 10:31:01 24 4
gpt4 key购买 nike

我需要一个更好的 hibernate 枚举映射和 this页面为我提供了很好的服务(除了我使用 char 类型而不是 int)。

下一个问题是如何以通用方式序列化/反序列化枚举?

想想性别枚举:

@JsonSerialize(using = PersistentEnumSerializer.class)
@JsonDeserialize(using = PersistentEnumDeserializer.class)
public enum Gender implements PersistentEnum {

MALE("M", "Male"), FEMALE("F", "Female");

private String code;

private String display;

Gender(String code, String display) {
this.code = code;
this.display = display;
}

public String getName() {
return name();
}

public String getCode() {
return code;
}

public String getDisplay() {
return display;
}

public String toString() {
return display;
}

}

它实现了 PersistentEnum 接口(interface)的 getName()、getCode() 和 getDisplay() 方法。序列化很容易:

public class PersistentEnumSerializer extends JsonSerializer<PersistentEnum> {

@Override
public void serialize(PersistentEnum object, JsonGenerator generator, SerializerProvider provider) throws IOException, JsonProcessingException {
generator.writeStartObject();
generator.writeFieldName("name");
generator.writeString(object.getName());
generator.writeFieldName("code");
generator.writeString(object.getCode());
generator.writeFieldName("display");
generator.writeString(object.getDisplay());
generator.writeEndObject();
}
}

但是如何在 java 6 中反序列化?在 Java 8 中,我会向 PersistentEnum 接口(interface)添加一个静态方法。

public class PersistentEnumDeserializer extends JsonDeserializer<PersistentEnum> {

@Override
public PersistentEnum deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
JsonNode node = jp.getCodec().readTree(jp);
//String value = node.get("name").asText();
//TODO Somehow I need to get Gender.MALE if the json is {"name":"MALE","code":"M","display":"Male"}
return null;
}

}

最佳答案

一个可能的解决方案是向 PersistentEnum 添加一个新方法 getType(),它将识别 Enum 的类型。

@JsonSerialize(using = PersistentEnumSerializer.class)
@JsonDeserialize(using = PersistentEnumDeserializer.class)
public enum Gender implements PersistentEnum {
@Override
public String getType() {
return "gender";
}
}

序列化器也应该修改为在序列化时包含类型。

public class PersistentEnumSerializer extends JsonSerializer<PersistentEnum> {

@Override
public void serialize(PersistentEnum object, JsonGenerator generator, SerializerProvider provider) throws IOException, JsonProcessingException {
generator.writeStartObject();
generator.writeFieldName("name");
generator.writeString(object.getName());
generator.writeFieldName("code");
generator.writeString(object.getCode());
generator.writeFieldName("display");
generator.writeString(object.getDisplay());
generator.writeFieldName("type");
generator.writeString(object.getType());
generator.writeEndObject();
}
}

反序列化器可以写成如下所示。

    public class PersistentEnumDeserializer extends JsonDeserializer<PersistentEnum> {

@Override
public PersistentEnum deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
JsonNode node = jp.getCodec().readTree(jp);
return findEnum(node.get("type").asText(), node.get("name").asText());
}

private PersistentEnum findEnum(String type, String name) {
switch (type) {
case "gender":
return Gender.valueOf(name);
// handle other types here.
default:
return null;
}
}

}

关于java - 通用枚举 Json 反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43464927/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com