繁体   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