0 / 0 / 0
Регистрация: 15.03.2016
Сообщений: 135

Преобразовать ответ с JSON объектом в DTO

27.06.2017, 19:25. Показов 9644. Ответов 22

Студворк — интернет-сервис помощи студентам
Я использую API которое возвращает JSON объект такого вида:
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
{
"response": {
    "GeoObjectCollection": {
        "featureMember": [
            {
                "GeoObject": {
                    "Point": {
                        "pos": "37.611347 55.760241"
                    }
                }
            },
            {
                "GeoObject": {
                    "Point": {
                        "pos": "37.593965 55.771575"
                    }
                }
            }
        ]
    }
}
}
Я хочу конвертировать данный объект в DTO model в моем Spring Boot приложении. Как это можно сделать? Во всех, примерах, которые я находил, рассматривался самый простой объект вида, как, например, здесь:
JSON
1
2
3
4
5
6
7
{
   type: "success",
   value: {
      id: 10,
      quote: "Really loving Spring Boot, makes stand alone Spring apps easy."
   }
}
И там создали два класса DTO и на этом все. Как действовать здесь, не понятно.

Нужно создавать классы response, GeoObjectCollection, GeoObject и т.д. или есть что-то проще и правильней?

Добавлено через 1 час 51 минуту
Вообщем сделал класс:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package ru.geo.converter.model;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.util.List;
 
@Data
public class GeographicCoordinatesDto {
   @JsonProperty("response")
   private ResponseResult responseResult;
}
 
@Data
class ResponseResult {
   @JsonProperty("GeoObjectCollection")
   private GeoObjectCollection geoObjectCollection;
}
 
@Data
class GeoObjectCollection {
  @JsonProperty("featureMember")
  private List<FeatureMember> featureMember;
}
 
@Data
class FeatureMember {
   @JsonProperty("GeoObject")
   private GeoObject geoObject;
}
 
@Data
class GeoObject {
   @JsonProperty("Point")
   private PointItem pointItem;
}
 
@Data class PointItem {
   @JsonProperty("pos")
   private String geoCoordinates;
}
Затем пытаюсь маппить:
Java
1
2
GeographicCoordinatesDto geographicCoordinatesDto = mapper.readValue(jsonInString, GeographicCoordinatesDto.class);
System.out.println(geographicCoordinatesDto.getResponseResult());
В итоге возвращается следующее:
Java
1
ResponseResult(geoObjectCollection=GeoObjectCollection(featureMember=[FeatureMember(geoObject=GeoObject(pointItem=PointItem(geoCoordinates=37.611347 55.760241))), FeatureMember(geoObject=GeoObject(pointItem=PointItem(geoCoordinates=37.593965 55.771575)))]))
Но, стоит добавить в JSON ряд других полей, все падает. Понятно, что данный JSON содержит множество других данных, которые мне абсолютно не нужны при парсинге, не описывать же каждый из них в классах. Мне просто нужно забрать координаты.

Неужели ни у кого нет мыслей и с такой задачей не сталкивался?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.06.2017, 19:25
Ответы с готовыми решениями:

Динамически конвертировать JSON в нужный DTO класс
С помощью get запроса к api (https://api.tfl.gov.uk/Road?app_id=fdff28a0&amp;app_key=5b002afe79e22fea5ded1abf9039f2de) получаю json данные. И...

Как отправить json post запросом и принят json в ответ?
Вообщем начал постигать новую windows phone... Решил сразу попытаться наладить общение с сервером. Но вот что то не очень выходит....

Распарсить с помощью Json.Net приходящий ответ в виде JSON
Нужна помощь с json {&quot;success&quot;:true, &quot;rgInventory&quot;:{ &quot;1025429056&quot;:{ &quot;id&quot;:&quot;1025429056&quot;, &quot;classid&quot;:&quot;310779217&quot;,...

22
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
30.06.2017, 15:33
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от LeX Посмотреть сообщение
пруф?
там выше кусочек кода.
Цитата Сообщение от Neo-X2006 Посмотреть сообщение
А как это преобразовать в DTO
получаешь pos, делаешь split по пробелу, на выходе будет массив из двух строк, для каждой делаешь Double.parseDouble, получаешь два дабла, делаешь класс Point с полями x и y типа double, объявляешь конструкторб который принимает два параметра...
0
Эксперт Java
378 / 370 / 114
Регистрация: 30.06.2010
Сообщений: 1,445
04.07.2017, 07:13
Цитата Сообщение от xoraxax Посмотреть сообщение
там выше кусочек кода.
это не автоматический маппинг, удобнее же описать один раз и все автоматизировать, не так ли?)

Цитата Сообщение от Neo-X2006 Посмотреть сообщение
Если так, то валится с ошибкой:
ты Point или pos получаешь? будет работать только с первым
0
 Аватар для we2seek
84 / 84 / 42
Регистрация: 25.01.2010
Сообщений: 386
05.07.2017, 04:05
Так пойдет?

Pos.java:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Pos {
    private String x;
    private String y;
 
    public Pos() {
    }
 
    public Pos(String posXAndY) {
        String[] split = posXAndY.split(" ");
        if (split.length == 2) {
            this.x = split[0];
            this.y = split[1];
        }
    }
 
    @Override
    public String toString() {
        return String.format("Pos{x=%s, y=%s}", x, y);
    }
}
App.java:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public class App {
    private static final String JSON = "{\n" +
            "  "response": {\n" +
            "    "GeoObjectCollection": {\n" +
            "      "featureMember": [\n" +
            "        {\n" +
            "          "GeoObject": {\n" +
            "            "Point": {\n" +
            "              "pos": "37.611347 55.760241"\n" +
            "            }\n" +
            "          }\n" +
            "        },\n" +
            "        {\n" +
            "          "GeoObject": {\n" +
            "            "Point": {\n" +
            "              "pos": "37.593965 55.771575"\n" +
            "            }\n" +
            "          }\n" +
            "        }\n" +
            "      ]\n" +
            "    }\n" +
            "  }\n" +
            "}";
 
    public static void main(String[] args) throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        JsonNode root = mapper.readTree(JSON);
 
        Iterator<JsonNode> elements = root.path("response").path("GeoObjectCollection").path("featureMember").elements();
        while (elements.hasNext()) {
            JsonNode pos = elements.next().path("GeoObject").path("Point").path("pos");
            Pos pos1 = mapper.treeToValue(pos, Pos.class);
            System.out.println(pos1);
        }
    }
 
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.07.2017, 04:05

Flask и SQLAlchemy и JSON. Не получается преобразовать результат запроса в json
У меня есть БД построенная из этих моделей с помощью миграций: # Class Class stores info about dish categories class...

ответ json
отправляю по аяксу данные $.ajax({ url:&quot;notis.php&quot;, data:&quot;&quot;, dataType: &quot;json&quot;, ...

PHP - Json ответ
Привет всем! подключаю API Яндекс кассы https://kassa.yandex.ru/docs/guides/#shag-1-sozdajte-platezh Создаю платеж (шаг 1 );...

JSON ответ от сервера
Люди добрые!!! Выручайте бедолагу. Который день ломаю голову (*от не знаний). Объясню ситуацию - есть приложение (скопипастил скрипты с...

Распарсить JSON ответ
Всем привет. Суть дела: пишу плагин для хрома. На сайте по нажатию на кнопку серверу отправляется POST-запрос в формате ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
23
Ответ Создать тему
Опции темы

Новые блоги и статьи
SUNO Ai - Река Без Дна
zorxor 31.07.2026
Автор стихотворения - астрофизик Марина Катыс Ссылка на сгенерированную музыкальную композицию: https:/ / suno. com/ song/ 6f6e5464-b290-4650-be6c-44c85f8d8013 Я говорю, что Время- как вода течет. . .
Из невошедшего на форум (диалог с ИИ-гугла)
zorxor 29.07.2026
А вот, что интересно, сказал мне ИИ-гугла: Этот текст — эмоциональный пост пользователя под ником zorxor на интернет-форуме (вероятно, посвященном мистике, непознанному или альтернативной науке). . . .
Был праздник вчера, а я и не знал.
kumehtar 28.07.2026
27. 07. 2026г. Intel Core 2 Duo исполнилось 20 лет Новости компьютерного мира и их обсуждение (4) Салют, шампанское, овации! :drink:
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр. Дословно, отклонённая. . .
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
Очистка реквизитов и табличных частей документа при копировании (вариант 2)
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2. Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru