Отображение Jackson JSON на Java для одного и того же атрибута с другим типом данных - PullRequest
4 голосов
/ 28 июня 2011

У меня есть объект 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,
...
}

ИЛИ

Дело B

{
...
    items: [
            { "id": id1, "name": name1 },
            { "id": id2, "name": name2 }
           ]
...
}

Если я создаю POJO для сопоставления с делом A, дело B завершается неудачей, и наоборот.Короче говоря, есть ли способ сопоставить атрибут JSON с полем POJO с различными типами данных?В этом случае я создам два отдельных поля в POJO с именем

private URL itemLink;
private Item[] itemList;

1 Ответ

2 голосов
/ 28 июня 2011

Это зависит от точных деталей, но если вы спрашиваете, возможно ли сопоставить массив JSON String или JSON в свойство Java, да, это можно сделать.

Очевидным способом было бы определить пользовательский десериализатор, который обрабатывает оба вида ввода JSON. Но также возможно определить тип Java таким образом, что он может быть создан как путем установки свойств (который работает из JSON Object), так и с помощью конструктора single-String-arg или статического фабричного метода single-String-arg, помеченного @ JsonCreator.

Еще одна возможность - использовать промежуточный тип, который можно десериализовать из любого JSON: оба экземпляра java.lang.Object и JsonNode ("JSON tree") могут быть созданы из любого JSON. Из этого значения вам нужно будет выполнить ручное преобразование; скорее всего в сеттере, вот так:

public void setItems(JsonNode treeRoot) { .... }

Однако не сработает определение двух свойств с одинаковым именем.

Одна вещь, которую я не совсем понимаю, это то, как вы могли бы конвертировать из списка в URL, хотя. Поэтому, возможно, вам действительно нужны два отдельных внутренних поля; и setter просто назначит один из них (а getter вернет значение только одного).

...