Jackson JSON to Java映射具有不同数据类型的相同属性

时间:2011-06-27 23:08:06

标签: json mapping jackson

我有一个我无法控制的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;

1 个答案:

答案 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只返回一个值)。