Форум программистов, компьютерный форум, киберфорум
Наши страницы
Java EE (J2EE)
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
Neo-X2006
0 / 0 / 0
Регистрация: 15.03.2016
Сообщений: 135
1

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

27.06.2017, 19:25. Просмотров 964. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.06.2017, 19:25
Ответы с готовыми решениями:

Комплексный json - ответ в spring boot используя jackson
Пишу spring mvc. Для отправки json использую view с полями id, name, phone. И...

Java, JSON и JSON Simple. Непонятка с созданием объекта JSON на сервере для отправки на фронт
Здравствуйте. Разрабатываю интернет-магазин на Java. Мне нужно на фронте...

Как на java сделать JSON запрос и ответ от какого нибудь определенного сайта. Как это все делается ?
цццц

Dto-Entity mapper
Привет. Есть дто, есть энтити, надо одно копировать в другое, ну и обратно....

Маппинг запроса в DTO
Всем привет! Столкнулся с определенными трудностями. Приложение написано на...

22
xoraxax
1343 / 1285 / 378
Регистрация: 05.07.2013
Сообщений: 6,172
Завершенные тесты: 1
30.06.2017, 15:33 21
Цитата Сообщение от LeX Посмотреть сообщение
пруф?
там выше кусочек кода.
Цитата Сообщение от Neo-X2006 Посмотреть сообщение
А как это преобразовать в DTO
получаешь pos, делаешь split по пробелу, на выходе будет массив из двух строк, для каждой делаешь Double.parseDouble, получаешь два дабла, делаешь класс Point с полями x и y типа double, объявляешь конструкторб который принимает два параметра...
0
LeX
344 / 343 / 107
Регистрация: 30.06.2010
Сообщений: 1,338
04.07.2017, 07:13 22
Цитата Сообщение от xoraxax Посмотреть сообщение
там выше кусочек кода.
это не автоматический маппинг, удобнее же описать один раз и все автоматизировать, не так ли?)

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

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
05.07.2017, 04:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.07.2017, 04:05

Spring Boot Entity and DTO
Добрый день, уважаемые коллеги :senor: Потратил весь день, не могу найти ни...

Возможно ли соеденить несколько одинаковых DTO ?
К примеру, Школа, есть списки классов, у них будут одинаковые DTO, примерно...

Использование одного DTO для разных таблиц
Вопрос к опытным программистам. Eсть похожие таблицы БД и есть возможность...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru