簡體   English   中英

Jackson 枚舉反序列化委托

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM