Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
disx
23 / 23 / 0
Регистрация: 26.02.2014
Сообщений: 601
Записей в блоге: 1
1

Как посылать в POST-запросе Мега-JSON?

14.10.2017, 18:26. Просмотров 830. Ответов 4
Метки нет (Все метки)

Имею такой json:

JSON
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
{
  "name": "name", 
  "cnp": 123456789, 
  "chornumber": 4, 
  "PeekHour":23.5,
  
    "Contact":{
        "Mobile": "+128888888;+148888888"
    },
    "Location":{
        "Lat": 53.95959595,
        "Lng": 27.1884398
    },
    "Address":{
        "Street": "улица",
        "Building": "21",
        "Apartment": 126,
        "City":{
            "Ru": "Город",
            "Country": {
                "Shortname": "CN"
            }
        }
    },
    "Timetable": [
            {"Start": "9:00", "End": "18:00", "DinnerStart":"12:00", "DinnerEnd":"13:00", "Day": 1},
            {"Start": "9:00", "End": "15:00", "Day": 6}
        ]
}
в postman посылаю в таком виде приходит "нужный" ответ,

но как только делаю это через Retrofit или OkHttp сплошные ошибки...

модель генерил тут http://www.jsonschema2pojo.org/

интерфейс:
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
   @FormUrlEncoded()
    @POST("api/add")
    Call<Register> registerData(@Field("name") String name,
                                                  @Field("cnp") int cnp,
                                                  @Field("chornumber") int chornumber,
                                                  @Field("peekhour") double peekhour,
                                                  @Field("mobile") String mobile,
                                                  @Field("lat") double lat,
                                                  @Field("lng") double lng,
                                                  @Field("street") String street,
                                                  @Field("building") String building,
                                                  @Field("ru") String ru,
                                                  @Field("shortname") String shortname
                                                  );

код ответа 415

если так:
Кликните здесь для просмотра всего текста
Java
1
2
3
    @Headers("Content-Type: application/json")
    @POST("api/add")
   Call<Register> registerData(@Body RegistrationBody registrationBody);


registrationBody.setName(name);
registrationBody.setUnp(Integer.parseInt("31564645"));
registrationBody.setAnchornumber(4);
registrationBody.setPayhour(23.5); // may be DecimalFormat
registerData.getAddress().getCity().setRu(city); //Начиная с этой строки ругается такой ошибкой:
java.lang.NullPointerException: Attempt to invoke virtual method 'com.dis.retrofit2.Model.City com.dis.retrofit2.Model.Address.getCity()' on a null object reference
может я не правильно передаю параметры в Body, подскажите пожалуйста кто сталкивался?
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.10.2017, 18:26
Ответы с готовыми решениями:

Как отправлять get, post запрос а затем обработать в формате json?
Как на android srudio отправить post, ger запрос, затем обработать ответ в...

Retrofit, JSON, @POST, @GET
Уважаемые программисты, прошу вашей помощи! Хожу на курсы по разработке...

Кодировка в post запросе
Добрый вечер... Делаю пост запрос таким образом: ...

Распаковка JSON-данных, полученных в get-запросе VK api
Пишу в Android Studio программку, начал с простого, чтобы понять, как всё...

Передать JSON в теле POST запроса?
Хочу подключиться к сайту но не могу понять как предавать json в post запросе?...

4
demixdn
310 / 255 / 79
Регистрация: 31.10.2016
Сообщений: 619
16.10.2017, 14:03 2
disx, вы кладете объект city в setRu(city)?
Вам нужно сначала создать объект Country, засеттить его в созданный объект City, City засеттить в созданный объект Address, ну и так далее. NPE самая легкая ошибка из всех возможных.
1
disx
23 / 23 / 0
Регистрация: 26.02.2014
Сообщений: 601
Записей в блоге: 1
16.10.2017, 16:24  [ТС] 3
demixdn, сделал так, не проходит пока...

а можно как-то registrationBody вывести в лог в виде JSON, чтоб можно было сравнить что я делаю и и что должно быть?
0
demixdn
310 / 255 / 79
Регистрация: 31.10.2016
Сообщений: 619
16.10.2017, 18:54 4
Лучший ответ Сообщение было отмечено disx как решение

Решение

Сгенерил классы и проверил.
Кликните здесь для просмотра всего текста

From*json: RegistrationBody{name='name', cnp=123456789, chornumber=4, peekHour=23.5, contact=Contact{mobileNumber='+128888888;+148888888'}, location=Location{lat=53.95959595, lon=27.1884398}, address=Address{street='улица', building='21', apartment=126, city=City{cityNameRu='Город', country=Country{shortName='CN'}}}, timetable=[TimeCell{startTime='9:00', endTime='18:00', dinnerStart='12:00', dinnerEnd='13:00', dayNumber=1}, TimeCell{startTime='9:00', endTime='15:00', dinnerStart='null', dinnerEnd='null', dayNumber=6}]}


To*json: {"Address":{"Apartment":126,"Building":"21","City":{"Ru":"Город","Country":{"Shortname":"CN"}},"Street":"улица"},"chornu mber":4,"cnp":123456789,"Contact":{"Mobile":"+128888888;+148888888"},"Location":{"Lat":53.95959595,"Lng":27.1884398},"na me":"name","PeekHour":23.5,"Timetable":[{"Day":1,"DinnerEnd":"13:00","DinnerStart":"12:00","End":"18:00","Start":"9:00"},{"Day":6,"End":"15:00","Start":"9:00 "}]}


И вот гигантский класс. Его если будете потом использовать лучше разделить.
Кликните здесь для просмотра всего текста
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
import com.google.gson.Gson;
import com.google.gson.annotations.SerializedName;
 
import java.util.List;
 
public class RegistrationBody {
    private String name;
    private int cnp;
    private int chornumber;
    @SerializedName("PeekHour")
    private double peekHour;
    @SerializedName("Contact")
    private Contact contact;
    @SerializedName("Location")
    private Location location;
    @SerializedName("Address")
    private Address address;
    @SerializedName("Timetable")
    private List<TimeCell> timetable;
 
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public int getCnp() {
        return cnp;
    }
 
    public void setCnp(int cnp) {
        this.cnp = cnp;
    }
 
    public int getChornumber() {
        return chornumber;
    }
 
    public void setChornumber(int chornumber) {
        this.chornumber = chornumber;
    }
 
    public double getPeekHour() {
        return peekHour;
    }
 
    public void setPeekHour(double peekHour) {
        this.peekHour = peekHour;
    }
 
    public Contact getContact() {
        return contact;
    }
 
    public void setContact(Contact contact) {
        this.contact = contact;
    }
 
    public Location getLocation() {
        return location;
    }
 
    public void setLocation(Location location) {
        this.location = location;
    }
 
    public Address getAddress() {
        return address;
    }
 
    public void setAddress(Address address) {
        this.address = address;
    }
 
    public List<TimeCell> getTimetable() {
        return timetable;
    }
 
    public void setTimetable(List<TimeCell> timetable) {
        this.timetable = timetable;
    }
 
    @Override
    public String toString() {
        return "RegistrationBody{" +
                "name='" + name + '\'' +
                ", cnp=" + cnp +
                ", chornumber=" + chornumber +
                ", peekHour=" + peekHour +
                ", contact=" + contact +
                ", location=" + location +
                ", address=" + address +
                ", timetable=" + timetable +
                '}';
    }
 
 
    public String toJson() {
        return new Gson().toJson(this);
    }
 
    public static class Address {
        @SerializedName("Street")
        private String street;
        @SerializedName("Building")
        private String building;
        @SerializedName("Apartment")
        private int apartment;
        @SerializedName("City")
        private City city;
 
        public String getStreet() {
            return street;
        }
 
        public void setStreet(String street) {
            this.street = street;
        }
 
        public String getBuilding() {
            return building;
        }
 
        public void setBuilding(String building) {
            this.building = building;
        }
 
        public int getApartment() {
            return apartment;
        }
 
        public void setApartment(int apartment) {
            this.apartment = apartment;
        }
 
        public City getCity() {
            return city;
        }
 
        public void setCity(City city) {
            this.city = city;
        }
 
        @Override
        public String toString() {
            return "Address{" +
                    "street='" + street + '\'' +
                    ", building='" + building + '\'' +
                    ", apartment=" + apartment +
                    ", city=" + city +
                    '}';
        }
    }
 
    public static class City {
        @SerializedName("Ru")
        private String cityNameRu;
 
        @SerializedName("Country")
        private Country country;
 
        public String getCityNameRu() {
            return cityNameRu;
        }
 
        public void setCityNameRu(String cityNameRu) {
            this.cityNameRu = cityNameRu;
        }
 
        public Country getCountry() {
            return country;
        }
 
        public void setCountry(Country country) {
            this.country = country;
        }
 
        @Override
        public String toString() {
            return "City{" +
                    "cityNameRu='" + cityNameRu + '\'' +
                    ", country=" + country +
                    '}';
        }
    }
 
    public static class Contact {
        @SerializedName("Mobile")
        private String mobileNumber;
 
        public String getMobileNumber() {
            return mobileNumber;
        }
 
        public void setMobileNumber(String mobileNumber) {
            this.mobileNumber = mobileNumber;
        }
 
        @Override
        public String toString() {
            return "Contact{" +
                    "mobileNumber='" + mobileNumber + '\'' +
                    '}';
        }
    }
 
    public static class Country {
        @SerializedName("Shortname")
        private String shortName;
 
        public String getShortName() {
            return shortName;
        }
 
        public void setShortName(String shortName) {
            this.shortName = shortName;
        }
 
        @Override
        public String toString() {
            return "Country{" +
                    "shortName='" + shortName + '\'' +
                    '}';
        }
    }
 
    public static class Location {
 
        @SerializedName("Lat")
        private double lat;
        @SerializedName("Lng")
        private double lon;
 
        public double getLat() {
            return lat;
        }
 
        public void setLat(double lat) {
            this.lat = lat;
        }
 
        public double getLon() {
            return lon;
        }
 
        public void setLon(double lon) {
            this.lon = lon;
        }
 
        @Override
        public String toString() {
            return "Location{" +
                    "lat=" + lat +
                    ", lon=" + lon +
                    '}';
        }
    }
 
    public static class TimeCell {
        @SerializedName("Start")
        private String startTime;
        @SerializedName("End")
        private String endTime;
        @SerializedName("DinnerStart")
        private String dinnerStart;
        @SerializedName("DinnerEnd")
        private String dinnerEnd;
        @SerializedName("Day")
        private int dayNumber;
 
        public String getStartTime() {
            return startTime;
        }
 
        public void setStartTime(String startTime) {
            this.startTime = startTime;
        }
 
        public String getEndTime() {
            return endTime;
        }
 
        public void setEndTime(String endTime) {
            this.endTime = endTime;
        }
 
        public String getDinnerStart() {
            return dinnerStart;
        }
 
        public void setDinnerStart(String dinnerStart) {
            this.dinnerStart = dinnerStart;
        }
 
        public String getDinnerEnd() {
            return dinnerEnd;
        }
 
        public void setDinnerEnd(String dinnerEnd) {
            this.dinnerEnd = dinnerEnd;
        }
 
        public int getDayNumber() {
            return dayNumber;
        }
 
        public void setDayNumber(int dayNumber) {
            this.dayNumber = dayNumber;
        }
 
        @Override
        public String toString() {
            return "TimeCell{" +
                    "startTime='" + startTime + '\'' +
                    ", endTime='" + endTime + '\'' +
                    ", dinnerStart='" + dinnerStart + '\'' +
                    ", dinnerEnd='" + dinnerEnd + '\'' +
                    ", dayNumber=" + dayNumber +
                    '}';
        }
    }
}



И код, что выводит строки
Java
1
2
3
4
RegistrationBody registrationBody = new Gson().fromJson(JSON, RegistrationBody.class);
Log.d("From json", registrationBody.toString());
 
Log.d("To json", registrationBody.toJson());
1
disx
23 / 23 / 0
Регистрация: 26.02.2014
Сообщений: 601
Записей в блоге: 1
16.10.2017, 20:39  [ТС] 5
demixdn, искренне благодарен, все непонятки устранены
0
16.10.2017, 20:39
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.10.2017, 20:39

Получить json в ответ на POST запрос
Никак не могу добиться получения json с помощью вывода его через echo в PHP...

Ошибка в POST запросе, retrofit2 googledrive
Здравствуйте, хочу выполнить запрос На сохранение картинки на сервер...

Послать POST запрос с параметрами и получить json
Всем привет! Столкнулся с проблемой. Как послать POST запрос и получить назад...


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

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

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