[英]Jackson enum deserialization delegation
有沒有辦法反序列化適用於名稱和對象符號的枚舉。 我確實希望將 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 文件是否采用"type": {"name":"MYENUM"}或{"type": "MYENUM"} 的形式。 可以使用JsonNode.html#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)
刪除您的deserialize
方法來注釋您的MyType
枚舉,如下所示:
@JsonDeserialize(using = MyTypeDeserializer.class)
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum MyType { //omitted fields and methods for brevity }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.