Модель данных для вложенного объекта в Retrofit / GSON - PullRequest
0 голосов
/ 05 июня 2019

Я использую API удаленной погоды и получил от него следующие данные. Я звоню с Retrofit и использую GSON.

{"coord":{"lon":127.08,"lat":37.51},"weather":[{"id":701,"main":"Mist","description":"mist","icon":"50n"},
{"id":721,"main":"Haze","description":"haze","icon":"50n"}],"base":"stations",
"main":{"temp":18,"pressure":1013,"humidity":82,"temp_min":17,"temp_max":19},
"visibility":9000,"wind":{"speed":1.5,"deg":160},"clouds":{"all":40},"dt":1559762819,
"sys":{"type":1,"id":8096,"message":0.0054,"country":"KR","sunrise":1559765465,
"sunset":1559818179},"timezone":32400,"id":1837217,"name":"Sinch’ŏn-dong","cod":200}

У меня есть одна модель данных с именем Погода . Если я хочу, чтобы моя модель данных также поддерживала wind , нужно ли создавать для нее отдельную модель данных, поскольку она вложена в ответ JSON, который я показал выше?

Ответы [ 3 ]

1 голос
/ 07 июня 2019

Ответ, который вы получите, является объектом, который содержит Погода и Ветер Давайте назовем его WeatherResponse.Упрощенный код JSON выглядит следующим образом:

{
  "weather": [
    {
      "id": 701,
      "main": "Mist",
      "description": "mist",
      "icon": "50n"
    },
    {
      "id": 721,
      "main": "Haze",
      "description": "haze",
      "icon": "50n"
    }
  ],
  "wind": {
    "speed": 1.5,
    "deg": 160
  }
}

В вашем API для модернизации может быть что-то подобное:

@GET("weather")
Call<WeatherResponse> getWeather();

, где WeatherResponse выглядит так:

public class WeatherResponse {
    public Collection<Weather> weather;
    public Wind wind; // You need to add & implement this!
}

Если вы уже можете разобрать ваш Weather, он должен выглядеть следующим образом:

public class Weather {
    public Long id;
    public String main;
    public String description;
    public String icon;
}

и вам нужно реализовать класс Wind как:

public class Wind {
    public Double speed;
    public Integer deg;

}

( Я объявил все поля открытыми только для того, чтобы сократить код, поэтому опускаю геттеры и сеттеры. )

0 голосов
/ 06 июня 2019

да, вы должны создать новую модель данных. И будьте осторожны с обработкой возможных нулевых значений. Вот пример котлина И лично. Я предпочитаю делать модель вручную, а не с помощью инструмента. Делая это самостоятельно, вы можете реализовать множество вещей, таких как присвоение имен, возможные нулевые значения и ненужные данные

import com.google.gson.annotations.SerializedName

data class AdReplyRequest(@SerializedName("cc_sender") val cc_sender: Boolean,
                          @SerializedName("message") val message: AdReplyMessage)

data class AdReplyMessage(@SerializedName("body") val message: String,
                          @SerializedName("email") val email: String,
                          @SerializedName("name") val name: String,
                          @SerializedName("phone") val phone: String)

0 голосов
/ 05 июня 2019

На самом деле вы можете сделать это, создав один класс модели для каждого объекта и поместив их как переменную во внешний класс. Тем не менее, это занимает много времени

Предложения

  1. Поиск в интернете json to java/kotlin они будут конвертировать для вас
  2. Android Studio имеет много плагинов для выполнения той же работы. Просто установите тот, у которого звездочка выше, тогда эти плагины позаботятся о создании вашего класса pojo из заданного json input
...