我收到的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不能这样做
有没有办法在没有自定义反序列化程序的情况下执行此操作?
答案 0 :(得分:2)
如果不编写自定义反序列化器,我能想到的最好的是:
public class LandingPageContentItem {
private String id;
private String type;
private Object content;
}
然后使用if(item.content instanceof String)
和if(item.content instanceof Map)
从那里处理它。
答案 1 :(得分:2)
如果您不知道(或无法控制)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();
}