[英]Unmarshall JSON to subtypes with different field type jackson
我收到一个对象的JSON数组,这些对象都有字段内容 ,但是此字段的类型可能不同:
[
{
"id": "primaryBodyHeader",
"type": "RichText",
"content": "<h1>Alice's Adventures in Wonderland</h1>"
},
{
"id": "1027",
"type": "RichText",
"content": {
"value": "RVMtMTk=",
"contentType": "DynamicContent"
}
}
]
我有豆:
public abstract class LandingPageContentItem {
private String id;
private String type;
private String content;
}
至少当文本是文本时,我想将内容映射到文本字段(非文本内容为空)
最多,我想根据字段内容的类型(TextContentItem,ComplexContentItem等)将不同种类的项目映射到不同的子类。 @JsonSubTypes无法做到这一点
有没有自定义反序列化器的方法吗?
不编写自定义解串器,我能想到的最好的方法是:
public class LandingPageContentItem {
private String id;
private String type;
private Object content;
}
然后只使用if(item.content instanceof String)
和if(item.content instanceof Map)
从那里处理它。
如果您不知道(或无法控制) content
字段中可能包含的content
那么建议您像这样映射原始的com.fasterxml.jackson.databind.JsonNode
public static class LandingPageContentItem {
private final String id;
private final String type;
private final JsonNode content;
@JsonCreator
public LandingPageContentItem(
@JsonProperty("id") final String id,
@JsonProperty("type") final String type,
@JsonProperty("content") final JsonNode content) {
this.id = id;
this.type = type;
this.content = content;
}
/* some logic here */
}
然后您可以正常阅读
ObjectMapper mapper = new ObjectMapper();
List<LandingPageContentItem> items =
mapper.readValue(node, new TypeReference<List<LandingPageContentItem>>() {});
稍后,您可以验证JsonNode
是否为预期类型。
if (content.isTextual()) {
// do something with content.asText();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.