【问题标题】:Jackson enum deserialization delegationJackson 枚举反序列化委托
【发布时间】:2021-12-27 13:00:42
【问题描述】:

有没有办法反序列化一个既适用于名称又适用于对象表示法的枚举。我确实希望将 Shape 保留为反序列化的对象

例如这适用于“type”:{“name”:“MYENUM”},但我需要添加什么才能让它也适用于“type”:“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);
    }

【问题讨论】:

    标签: java json enums jackson


    【解决方案1】:

    解决您的问题的一种方法是自定义反序列化器扩展 StdDeserializer 并在其中检查您的 json 文件是否为 "type": {"name":"MYENUM"}{"type": "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) 删除您的deserialize 方法来注释您的MyType 枚举,如下所示:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-19
      • 1970-01-01
      • 2012-02-06
      • 1970-01-01
      • 2014-07-16
      • 2020-07-17
      • 1970-01-01
      • 2018-07-31
      相关资源
      最近更新 更多