繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM