多个 JsonCreator 注解方法

Men*_*los 5 java jackson

初始问题

是否可以有多种@JsonCreator方法,并且杰克逊可以根据方法定义检测应该使用哪一种方法?

@JsonCreator
public static StateOfComm factory(String id) {
    return StateOfComm.valueOf(id);
}

@JsonCreator
public static StateOfComm factory(CustomType value) {
    return StateOfComm.valueOf(value.getId());  
}
Run Code Online (Sandbox Code Playgroud)

更新

失败的 JSON(因为 id=null)如下:

{"comment":null, "processes":[{"stateOfComm":{"id":"CA"}}]}
Run Code Online (Sandbox Code Playgroud)

以下作品:

 {"comment":null, "processes":[{"stateOfComm":"CA"}]}
Run Code Online (Sandbox Code Playgroud)

Men*_*los 4

我通过摆脱注释@JsonCreator并使用一个StdDeserializer自定义的方法解决了这个问题。

这是一个例子:

@JsonIgnoreProperties(
        ignoreUnknown = true
    )
    @JsonDeserialize(
        using = IdTextEntry.Deserializer.class
    )
    @Data
    public class IdTextEntry implements IdAndText {
        String id;
        String text;

        public IdTextEntry(Enum<?> val) {
            if (val != null) {
                this.id = val.name();
                this.text = val.toString();
            }

        }        

        public static class Deserializer extends StdDeserializer<IdTextEntry> {
            public Deserializer() {
                this((Class)null);
            }

            Deserializer(Class<?> vc) {
                super(vc);
            }

            public IdTextEntry deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
                JsonNode node = (JsonNode)jp.getCodec().readTree(jp);
                String id;
                if (node.has("id") && node.has("text")) {
                    id = node.get("id").asText();
                    String text = node.get("text").asText();
                    return new IdTextEntry(id, text);
                } else if (node.has("id")) {
                    id = node.get("id").asText();
                    return new IdTextEntry(id, id);
                } else {
                    id = node.asText();
                    return new IdTextEntry(id, id);
                }
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)