2016-08-23 51 views
1

我接收它们都具有字段内容对象的JSON阵列亚型,但该字段的类型可能会有所不同:和解组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

如果你不知道(或者没有控制)可能是什么在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(); 
} 
2

无需编写自定义的解串器,我能想到的最好的是:

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

然后,只需使用if(item.content instanceof String)if(item.content instanceof Map)从那里处理它。

+0

@vsminkov有更好的答案。在大多数情况下,'JsonNode'可能比'Object'更好。 –