Клиент Spring Android: получить запрос, возвращающий более сложные объекты JSON

Я пытаюсь включить Spring для Android в качестве клиента сервера Spring в проект мобильного приложения. Посмотрев документацию (https://docs.spring.io/spring-android/docs/1.0.1.RELEASE/reference/html/rest-template.html), я хотел бы использовать метод getForObject() для непосредственного создания объектов, которые я буду использовать в коде. Все примеры, которые я нахожу в Интернете, показывают только то, что делать с более примитивным типом значения каждого ключа (String, long, int). Объект JSON, отправленный обратно с сервера, выглядит так:

{
  "id": "MSP-SS-043208",
  "nom": "Inondation-Débit-Niveau",
  "source": "Ministère de la Sécurité publique du Québec",
  "territoire": "Rivière des Mille Îles(043208)",
  "certitude": "Observé",
  "severite": "Mineure",
  "dateDeMiseAJour": "lundi 04 juin 2018",
  "urgence": "Future",
  "description": "Seuil de surveillance atteint",
  "count": 1,
  "geometry": {
      "type": "Point",
      "coordinates": [-73.6387202781213, 45.6928705203507]
  },
  "type": "Suivi des cours d'eau"
}

Моя проблема в том, что я понятия не имею, что делать с ключом геометрия, потому что это не примитивный объект! Как я могу заставить Spring распознать, что существует объект JSON как атрибут определенного ключа? А что насчет массива двойных (координаты)?

Это класс, который я пытаюсь использовать:

public class Alert {

  private String id;
  private String nom;
  private String source;
  private String territoire;
  private String certitude;
  private String severite;
  private String dateDeMiseAJour;
  private String urgence;
  private String description;
  private int count;
  private ????? geometry;
  private String type;

  ... gettters and setters ...

}

Мой вопрос сводится к следующему: как я должен объявить атрибут геометрии, чтобы убедиться, что объекты созданы правильно?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
39
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам нужно создать класс Geometry с некоторой логикой десериализации, а затем объявить private Geometry geometry как член класса Alert.

Эта десериализация обычно выполняется Spring «автоматически» (в частности, библиотекой fastxml, предоставленной Джексоном). Поскольку класс Geometry выглядит так, как будто у него есть несколько нетривиальных объектов, вам также необходимо определить класс Coordinates и класс Type (или Enum), которые можно аналогичным образом десериализовать.

Иногда при таком подходе можно создать множество небольших классов, с которыми нужно потрудиться. Другой подход - использовать аннотацию @JsonCreator в конструкторе класса Alert:

@JsonCreator
public Alert(Map<String, Object> params) {...}

Затем вы можете разобрать Alert json вручную.

большое спасибо ! Тип «type» всегда будет String, так что это не проблема. Будет ли Spring также автоматически преобразовывать атрибуты координат в массив Java? (Думаю, в нашем приложении можно использовать только двойные массивы).

Olivier L. Applin 06.07.2018 23:21

@ OlivierL.Applin Я считаю, что Spring преобразует JSONArray в список, я не уверен в массиве (массивы не являются правильными объектами, поэтому я не уверен). И Type, о котором я говорил, находился внутри Geometry, но я полагаю, что для этого можно использовать String.

ChocolateAndCheese 06.07.2018 23:29

Большой ! К сожалению, похоже, что я не могу отправить запрос на наш сервер прямо сейчас, поэтому я не могу протестировать ... но я буду держать вас в курсе, если он работает :)! Еще раз спасибо

Olivier L. Applin 06.07.2018 23:36

Теперь я могу правильно запросить наш сервер, и все работает нормально, кроме моей печально известной геометрии. Что именно вы имеете в виду под «логикой десериализации»? Клиент Spring для меня в новинку

Olivier L. Applin 20.07.2018 19:20

@ OlivierL.Applin Под логикой десериализации я просто подразумеваю логику, которая преобразует необработанный JSON в объект Java. Эта логика не всегда должна быть сложной, но иногда бывают случаи, когда объект Java существенно отличается от JSON, даже если вы можете конвертировать между ними.

ChocolateAndCheese 21.07.2018 01:59

Спасибо большое, мне удалось выполнить десериализацию без сложной логики, и она отлично работает!

Olivier L. Applin 21.07.2018 03:39

Другие вопросы по теме