繁体   English   中英

使用杰克逊将json数组转换为数组中具有不同对象元素的java对象

[英]Convert json array to java object with different object element in array using jackson

我有以下json具有字段名称为page_names的数组,该数组可以包含字符串或另一个对象。 有什么办法可以使用杰克逊将其转换为Java对象吗? 我有两个类:相应于整个对象和PageInfo PageStructure用于存储对象像{“名称”:“候选信息”,“部分”:2}。

{
  "url": "http://example.com",
  "is_auth_required": false,
  "page_names": [
    "Hello",
    {
      "name": "Candidate Information",
      "section":2
    },
    {
      "page_name": "Resume and Cover Letter",
      "section":3
    }
  ]
}

我可以使用以下代码进行转换,但随后我必须明确识别对象是否具有字符串或PageInfo。

@JsonIgnoreProperties(ignoreUnknown = true)
public class PageStructure {

  @JsonProperty("url")
  String                Url;
  @JsonProperty("is_auth_required")
  boolean               isAuthRequired          = true;
  @JsonProperty("page_names")
  List<Object>          PageNames;
  //GETTERS AND SETTERS
}

还有其他方法可以给page_names是String还是PageInfo对象?

有一个setter,可以让您输入任何字段及其名称,并根据需要进行操作。

@JsonAnySetter
public void set(String name, Object value) {
    if (name == "page_names")
        if (value instanceof String)
            // Treat it as a string
        else
            // Treat it as a JSON object
}

这是最简单的解决方案,但是它将您的模型与反序列化联系在一起。 另外,您可以定义自己的解串器:

public class PageStructureDeserializer extends JsonDeserializer<PageStructure> {

    @Override
    public PageStructuredeserialize(JsonParser jp, DeserializationContext ctxt) 
      throws IOException, JsonProcessingException {
        JsonNode node = jp.getCodec().readTree(jp);

        // Look through the node, check whether the pages are strings or objects
        // See more info at http://www.baeldung.com/jackson-deserialization

        return new PageStructure(...);
    }
}

然后,只需将反序列化器添加到对象映射器中,便可以离开。

ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addDeserializer(PageStructure.class, new PageStructureDeserializer());
mapper.registerModule(module);

PageStructure readValue = mapper.readValue(json, PageStructure.class);

这肯定是一个复杂得多且冗长的方法,但这意味着您的普通数据对象不依赖JSON库。 您可以更改库,甚至可以从JSON更改为XML,而无需更改数据模型。 如果这是大型共享代码库的一部分,那么进行抽象可能值得付出努力。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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