java - 将 JSON 解码为具有不同字段类型 jackson 的子类型

标签 java json jackson json-deserialization

我收到一个对象的 JSON 数组,它们都有字段content,但是这个字段的类型可能不同:

[
    {
        "id": "primaryBodyHeader",
        "type": "RichText",
        "content": "<h1>Alice's Adventures in Wonderland</h1>"
    },
    {
        "id": "1027",
        "type": "RichText",
        "content": {
            "value": "RVMtMTk=",
            "contentType": "DynamicContent"
        }
    }
]

我有 bean :

public abstract class LandingPageContentItem {
    private String id;
    private String type;
    private String content;
}

至少我想将 content 映射到文本字段(非文本内容为 null)

最多,我想根据字段content 的类型将不同种类的项目映射到不同的子类——TextContentItem、ComplexContentItem 等等。 @JsonSubTypes 不能这样做

有没有办法在没有自定义反序列化器的情况下做到这一点?

最佳答案

如果您不知道(或无法控制)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(); 
}

关于java - 将 JSON 解码为具有不同字段类型 jackson 的子类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39110934/

相关文章:

java - 在 jFrame 上同时添加 2 个形状

java - 具有相反方向的枚举

java - 改造:使用 Jackson 反序列化失败,没有任何错误

javascript - 将深层对象映射到新对象的更好方法

javascript - 将嵌套对象传递给 POST 请求

java - Jackson:特定类型的所有属性都有不同的 JsonIninclude (例如可选)

java - 在不反序列化的情况下从 JSON 字符串中的任何位置删除键

java - 取消异步任务

java - 查找数组中元素周围的元素

ruby-on-rails - 在 Rails 中从 REST 获取 Post 数据