Jackson JSON 到 Java 映射,用于具有不同数据类型的相同属性

use*_*052 5 mapping json jackson

我有一个 JSON 对象,我无法控制它并希望将它映射到一个预先创建的 Java 对象。JSON 对象中有一个属性可以是 URL,也可以是 JSONArray。

Class SomeClass {

    private URL items;

    public URL getURL() {
        return items;
    }

    public void setURL(URL url) {
        this.items = url;
    }
}
Run Code Online (Sandbox Code Playgroud)

以下是 JSON:

案例一:

{
...
    items: http://someurl.abc.com/linktoitems,
...
}
Run Code Online (Sandbox Code Playgroud)

或者

案例B

{
...
    items: [
            { "id": id1, "name": name1 },
            { "id": id2, "name": name2 }
           ]
...
}
Run Code Online (Sandbox Code Playgroud)

如果我创建 POJO 来映射案例 A,案例 B 会失败,反之亦然。简而言之,有没有办法将 JSON 属性映射到具有不同数据类型的 POJO 字段?在这种情况下,我将在名为的 POJO 中创建两个单独的字段,

private URL itemLink;
private Item[] itemList;
Run Code Online (Sandbox Code Playgroud)

Sta*_*Man 2

这取决于确切的细节,但如果您询问的是是否可以将 JSON 字符串或 JSON 数组映射到 Java 属性中,那么可以这样做。

显而易见的方法是定义一个自定义反序列化器来处理两种 JSON 输入。但也可以通过设置属性(从 JSON 对象工作)来构造 Java 类型,并使用单字符串参数构造函数或用 @ 标记的静态单字符串参数工厂方法来定义 Java 类型。 JsonCreator。

另一种可能性是使用可以从任何 JSON 反序列化的中间类型:java.lang.Object 和 JsonNode(“JSON 树”)实例都可以从任何 JSON 创建。您需要根据该值进行手动转换;最有可能在设置器中,如下所示:

public void setItems(JsonNode treeRoot) { .... }
Run Code Online (Sandbox Code Playgroud)

然而,定义两个同名的属性是行不通的。

我不太明白的一件事是如何从列表转换为 URL。所以也许您实际上确实需要两个单独的内部字段;setter 只会分配给其中之一(而 getter 只会返回值 1)。