Разбор JSON с GSON, объект иногда содержит список, иногда содержащий объект

Я работаю с API, который иногда содержит список дочерних объектов:

{ 'obj' : { children: [ {id: "1"}, {id: "2"} ] } } 

Я не могу разобрать это без проблем. Но если есть только один ребенок, он не возвращает его в виде списка:

 { 'obj' : { children: {id: "1"} } } 

Мой синтаксический анализатор, который ожидает, что список затем сломается. Есть ли у кого-нибудь предложение о том, как с этим бороться?

С Gson единственный способ, которым я знаю, как справляться с подобными ситуациями, – это создать собственный десериализатор. Например:

 // outputs: // [Container: obj=[ChildContainer: children=[[Child: id=1], [Child: id=2]]]] // [Container: obj=[ChildContainer: children=[[Child: id=1]]]] public class Foo { static String json1 = "{\"obj\":{\"children\":[{\"id\":\"1\"},{\"id\":\"2\"}]}}"; static String json2 = "{\"obj\":{\"children\":{\"id\":\"1\"}}}"; public static void main(String[] args) { GsonBuilder gsonBuilder = new GsonBuilder(); gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES); gsonBuilder.registerTypeAdapter(Child[].class, new ChildrenDeserializer()); Gson gson = gsonBuilder.create(); Container container1 = gson.fromJson(json1, Container.class); System.out.println(container1); Container container2 = gson.fromJson(json2, Container.class); System.out.println(container2); } } class Container { ChildContainer obj; @Override public String toString() { return String.format("[Container: obj=%1$s]", obj); } } class ChildContainer { Child[] children; @Override public String toString() { return String.format("[ChildContainer: children=%1$s]", Arrays.toString(children)); } } class Child { String id; @Override public String toString() { return String.format("[Child: id=%1$s]", id); } } class ChildrenDeserializer implements JsonDeserializer { @Override public Child[] deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { if (json instanceof JsonArray) { return new Gson().fromJson(json, Child[].class); } Child child = context.deserialize(json, Child.class); return new Child[] { child }; } } 
  • Как импортировать существующий сертификат x509 и закрытый ключ в хранилище ключей Java для использования в SSL?
  • JTable, RowFilter и RowFilter.Entry
  • Почему Java-streamи отключены?
  • Есть ли что-то вроде интерактивного режима REPL для python, но для Java?
  • Найти элементы внутри форм и iframe с помощью Java и Selenium WebDriver
  • доступ к переменной из другого classа
  • Как использовать lambda Java8 для сортировки streamа в обратном порядке?
  • Как выбрать выпадающее значение в Selenium WebDriver с помощью Java
  • Я получаю исключение SocketTimeoutException в Jsoup: время чтения
  • Должен ли я использовать @EJB или @Inject
  • Hibernate: автоматическое создание / обновление таблиц db на основе classов сущностей
  • Interesting Posts

    сравнение iteratorов из разных контейнеров

    Недействительная спецификация продолжительности с FFMPEG – что может быть причиной?

    Два пересечения прямоугольников

    Как заменить обратную косую черту на косую черту с помощью java?

    Как печатать двоичный номер через printf

    Что делает флаг FD_CLOEXEC fcntl ()?

    Является ли он частным API для использования App-prefs: root?

    Ошибка Eclipse: «Не удалось подключиться к удаленной виртуальной машине»

    Добавление другого «питомца» в модельную форму

    Как имитировать поведение автоматической пересылки стека

    Как остановить перезапуск Windows 8; «15 минут» и подсчет …?

    Поиск наложения файловой системы с использованием LD_PRELOAD

    Регистрация DLL CPP в COM после установки с помощью установщика Wix Msi

    Есть ли способ получить уведомление, когда пользователь отключает устройство?

    Применить форматирование валюты к UITextField в событии изменения

    Давайте будем гением компьютера.