使用jackson

时间:2015-12-28 19:38:22

标签: java json jackson

我跟随json有一个字段名为 page_names 的数组,它可以包含字符串或其他对象。有没有办法使用jackson将其转换为java对象? 我有两个类: PageStructure 对应整个对象, PageInfo 用于存储对象,如 {" name":"候选信息&# 34;,"部分":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对象?

1 个答案:

答案 0 :(得分:1)

有一个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,而无需更改数据模型。如果这是大型共享代码库的一部分,那么进行抽象可能是值得的。