Я пытаюсь включить 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 ...
}
Мой вопрос сводится к следующему: как я должен объявить атрибут геометрии, чтобы убедиться, что объекты созданы правильно?




Вам нужно создать класс Geometry с некоторой логикой десериализации, а затем объявить private Geometry geometry как член класса Alert.
Эта десериализация обычно выполняется Spring «автоматически» (в частности, библиотекой fastxml, предоставленной Джексоном). Поскольку класс Geometry выглядит так, как будто у него есть несколько нетривиальных объектов, вам также необходимо определить класс Coordinates и класс Type (или Enum), которые можно аналогичным образом десериализовать.
Иногда при таком подходе можно создать множество небольших классов, с которыми нужно потрудиться. Другой подход - использовать аннотацию @JsonCreator в конструкторе класса Alert:
@JsonCreator
public Alert(Map<String, Object> params) {...}
Затем вы можете разобрать Alert json вручную.
@ OlivierL.Applin Я считаю, что Spring преобразует JSONArray в список, я не уверен в массиве (массивы не являются правильными объектами, поэтому я не уверен). И Type, о котором я говорил, находился внутри Geometry, но я полагаю, что для этого можно использовать String.
Большой ! К сожалению, похоже, что я не могу отправить запрос на наш сервер прямо сейчас, поэтому я не могу протестировать ... но я буду держать вас в курсе, если он работает :)! Еще раз спасибо
Теперь я могу правильно запросить наш сервер, и все работает нормально, кроме моей печально известной геометрии. Что именно вы имеете в виду под «логикой десериализации»? Клиент Spring для меня в новинку
@ OlivierL.Applin Под логикой десериализации я просто подразумеваю логику, которая преобразует необработанный JSON в объект Java. Эта логика не всегда должна быть сложной, но иногда бывают случаи, когда объект Java существенно отличается от JSON, даже если вы можете конвертировать между ними.
Спасибо большое, мне удалось выполнить десериализацию без сложной логики, и она отлично работает!
большое спасибо ! Тип «type» всегда будет String, так что это не проблема. Будет ли Spring также автоматически преобразовывать атрибуты координат в массив Java? (Думаю, в нашем приложении можно использовать только двойные массивы).