我有一个我无法控制的JSON对象,并希望将其映射到预先创建的Java对象。 JSON对象中有一个属性可以是URL,也可以是JSONArray。
Class SomeClass {
private URL items;
public URL getURL() {
return items;
}
public void setURL(URL url) {
this.items = url;
}
}
以下是JSON:
案例A:
{
...
items: http://someurl.abc.com/linktoitems,
...
}
OR
案例B
{
...
items: [
{ "id": id1, "name": name1 },
{ "id": id2, "name": name2 }
]
...
}
如果我创建POJO以映射案例A,则案例B失败,反之亦然。简而言之,有没有办法将JSON属性映射到具有不同数据类型的POJO字段?在这种情况下,我将在名为
的POJO中创建两个单独的字段private URL itemLink;
private Item[] itemList;
答案 0 :(得分:2)
这取决于确切的细节,但如果您要问的是是否可以将JSON字符串或JSON数组映射到Java属性,那么可以这样做。
明显的方法是定义一个处理两种JSON输入的自定义反序列化器。 但也可以通过设置属性(从JSON对象工作)和具有@标记的静态单字符串arg工厂方法来构造Java类型。 JsonCreator。
另一种可能性是使用可以从任何JSON反序列化的中间类型:可以从任何JSON创建java.lang.Object和JsonNode(“JSON树”)实例。从这个值你需要做手动转换;最有可能在二传手中,如下:
public void setItems(JsonNode treeRoot) { .... }
然而,不起作用的是定义两个具有相同名称的属性。
我不太关注的一件事是你如何从List转换为URL。所以也许你真的需要两个独立的内部领域;并且setter只会分配给其中一个(而getter只返回一个值)。