将JSON解组为具有不同字段类型jackson的子类型

时间:2016-08-23 21:25:28

标签: java json jackson json-deserialization

我收到的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不能这样做

有没有办法在没有自定义反序列化程序的情况下执行此操作?

2 个答案:

答案 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(); 
}