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