Jackson枚举反序列化委托



有没有一种方法可以反序列化枚举,既适用于名称也适用于对象表示法。我确实想通过将Shape保留为反序列化的对象

例如,这适用于";类型":{"名称":"MYENUM"},但我需要添加什么才能使其也适用于";类型":"MYENUM";

@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum MyType {
@JsonProperty("MYENUM")
MYENUM("MyEnum")
public final String name = name();
MyType(String value) {
this.value = value;
}
@JsonCreator
public static MyType deserialize (@JsonProperty("name") String name) {
return MyType.valueOf(name);
}
}

已尝试添加类似的代表

@JsonCreator(mode=JsonCreator.Mode.DELEGATING)
public static MyType deserializeString (String name) {
return MyType.valueOf(name);
}

解决问题的一种方法是使用自定义反序列化程序扩展StdDeserializer,并在其内部检查json文件是否为"类型":{"名称":"MYENUM"}{"类型":"MYENUM"}。这种检查可以通过JsonNode#isObject方法获得:

public class MyTypeDeserializer extends StdDeserializer<MyType> {
public MyTypeDeserializer() {
this(null);
}
public MyTypeDeserializer(Class<?> vc) {
super(vc);
}
@Override
public MyType deserialize(JsonParser jp, DeserializationContext dc) throws IOException, JsonProcessingException {
JsonNode root = jp.getCodec().readTree(jp);
JsonNode nodeType = root.get("type");
String name = nodeType.isObject() ? nodeType.get("name").asText() : nodeType.asText();
return MyType.valueOf(name);
}
}

然后,您可以用@JsonDeserialize(using = MyTypeDeserializer.class)注释MyType枚举,删除deserialize方法,如下所示:

@JsonDeserialize(using = MyTypeDeserializer.class)
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum MyType { //omitted fields and methods for brevity }

最新更新