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