Android Retrofit - Модели представляют собой массивы GSON из API - PullRequest
0 голосов
/ 29 мая 2020

При получении данных из открытого API погоды я получаю нули. Я использую retroFit2 в пределах android, чтобы получить данные. Вот сообщение из журнала:

 onResponse: server response Response{protocol=http/1.1, code=200, message=OK, 
 onResponse: WeatherResponse{weather=com.weatherapp.models.Weather@197d237}

Вот GSON:

 {
"coord": {
    "lon": -5.93,
    "lat": 54.58
},
"weather": [
    {
        "id": 804,
        "main": "Clouds",
        "description": "overcast clouds",
        "icon": "04d"
    }
],
"base": "stations",
"main": {
    "temp": 293.15,
    "feels_like": 288.01,
    "temp_min": 293.15,
    "temp_max": 293.15,
    "pressure": 1024,
    "humidity": 37
},
"visibility": 10000,
"wind": {
    "speed": 5.7,
    "deg": 160
},
"clouds": {
    "all": 96
},
"dt": 1590770221,
"sys": {
    "type": 1,
    "id": 1376,
    "country": "GB",
    "sunrise": 1590724667,
    "sunset": 1590785095
},

МОДЕЛЬ

@SerializedName("coord")
@Expose
private CoOrdinateModel coOrdinateModel;

@SerializedName("weather")
@Expose
private WeatherModel[] weatherModel;

@SerializedName("main")
@Expose
private MainModel main;

@SerializedName("visibility")
@Expose
private String visibility;

@SerializedName("wind")
@Expose
private WindModel wind;

ОТВЕТ

 public class WeatherResponse {

@SerializedName("coord")
@Expose()
private Weather weather;

public Weather getWeather() {
    return weather;
}

@Override
public String toString() {
    return "WeatherResponse{" +
            "weather=" + weather +
            '}';
}
}

API

  @GET("/data/2.5/weather")
Call<WeatherResponse> getWeather(
        @Query("id") String ID,
        @Query("APPID") String API_KEY
);

В идеале мне нужны почти все данные из GSON для анализа на объекты java в приложении android. Я делал это раньше с более простым GSON, но у этого есть массивы внутри, и я не уверен, что мой класс MODEL выполнен правильно, чтобы приспособиться к этому.

Любая помощь в определении root причины Нулевые значения были бы очень признательны

Ответы [ 2 ]

1 голос
/ 29 мая 2020

Ваша модель ответа неверна -

@SerializedName("main")
@Expose
private float main[];

это должно быть -

@SerializedName("main")
@Expose
private MainModel main;

, а ваш MainModel будет классом POJO, который вы пытаетесь проанализировать -

public class MainModel {
   @SerializedName("temp")
   public Double temp;
   @SerializedName("feels_like")
   public Double feelsLike;
}

Обращайтесь так же к другим, как wind, поскольку они не могут быть проанализированы с помощью класса String.

1 голос
/ 29 мая 2020

Те «массивы», о которых вы говорите, не являются массивами, это вложенные объекты (ну, weather - это массив объектов, но все же). Чтобы справиться с этим, вам необходимо создать вложенные классы в своем классе модели для обработки вложенных типов объектов, например:

public class Weather {
    public class Coordinate {
        @SerializedName("lat")
        @Expose
        public float lat;

        @SerializedName("long")
        @Expose
        public float long;
    }

    // ...

    @SerializedName("coord")
    @Expose
    public Coordinate coOrd;

    // repeat for every nested object type
}

В частности, для ключа weather помните, что это массив объектов, и поэтому поле в вашей модели должно быть объявлено как:

public WeatherData[] weather; // or whatever you name the nested class as
                              // I wouldn't recommend Weather, since you've
                              // already named your model that
...