是否可以有多种@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)
我通过摆脱注释@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)
| 归档时间: |
|
| 查看次数: |
11740 次 |
| 最近记录: |