Использование Джексона десериализации свойства, которое может быть списком объекта или объекта - PullRequest
0 голосов
/ 25 сентября 2019

Моя библиотека вызывает API, который может возвращать любую из следующих JSON-структур:и десериализовать его в соответствующий тип

Ответы [ 2 ]

0 голосов
/ 26 сентября 2019

Похоже, что вы ищете функцию десериализации ACCEPT_SINGLE_VALUE_AS_ARRAY.

Функция, которая определяет, допустимо ли принудительно использовать значения без массивов (в JSON) для работыс типами коллекции Java (массивы, java.util.Collection).Если этот параметр включен, десериализаторы коллекций будут пытаться обрабатывать значения, не относящиеся к массиву, как если бы они имели «неявное» окружение массива JSON.Эта функция предназначена для использования в целях совместимости / взаимодействия, для работы с пакетами (такими как конвертеры XML-в-JSON), которые исключают массив JSON в тех случаях, когда в массиве имеется только один элемент.

По умолчанию эта функция отключена.

Ее можно включить либо в ObjectMapper:

ObjectMapper mapper = new ObjectMapper();
mapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);

, либо с помощью аннотации @JsonFormat:

@JsonFormat(with = Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
private List<Foo> oneOrMany;

Для иллюстрации рассмотрим следующие документы JSON:

{
  "oneOrMany": [
    {
      "value": "one"
    },
    {
      "value": "two"
    }
  ]
}
{
  "oneOrMany": {
    "value": "one"
  }
}

Может быть десериализовано в следующие классы:

@Data
public class Foo {
    private List<Bar> oneOrMany;
}
@Data
public class Bar {
    private String value;
}

Просто убедитесь, что функция включена в вашем ObjectMapper или поле помечено @JsonFormat(with = Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY).


И если вы ищете эквивалентную функцию для сериализации, обратитесь к WRITE_SINGLE_ELEM_ARRAYS_UNWRAPPED.

0 голосов
/ 25 сентября 2019

Я бы рекомендовал использовать Object в качестве типа данных для свойства, которое является динамическим.Так вот мой образец.

import java.util.Arrays;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class MainObject {

    private Object key_is_same;

    public Object getKey_is_same() {
        return key_is_same;
    }

    public void setKey_is_same(Object key) {
        this.key_is_same = key;
    }

    public static class KeyObject {
        private String inner;

        public String getInner() {
            return inner;
        }

        public void setInner(String inner) {
            this.inner = inner;
        }

    }

    public static void main(String...s) throws JsonProcessingException {
        MainObject main = new MainObject();
        KeyObject k = new KeyObject();
        k.setInner("val1");
        main.setKey_is_same(k);

        ObjectMapper om = new ObjectMapper();
        System.out.println(om.writeValueAsString(main));

        main.setKey_is_same(Arrays.asList(k, k));
        System.out.println(om.writeValueAsString(main));

        public static void main(String...s) throws IOException {
        MainObject main = new MainObject();
        KeyObject k = new KeyObject();
        k.setInner("val1");
        main.setKey_is_same(k);

        ObjectMapper om = new ObjectMapper();
        System.out.println(om.writeValueAsString(main));

        main.setKey_is_same(Arrays.asList(k, k));
        System.out.println(om.writeValueAsString(main));

        // Deserialize
        MainObject mainWithObject = om.readValue("{\"key_is_same\":{\"inner\":\"val1\"}}", MainObject.class);
        MainObject mainWithList = om.readValue("{\"key_is_same\":[{\"inner\":\"val1\"},{\"inner\":\"val1\"}]}", MainObject.class);
        if(mainWithList.getKey_is_same() instanceof java.util.List) {
            ((java.util.List) mainWithList.getKey_is_same()).forEach(System.out::println);
        }
    }
    }

}

Выход

{"key_is_same":{"inner":"val1"}}
{"key_is_same":[{"inner":"val1"},{"inner":"val1"}]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...