Получение ожидаемого начала объектной ошибки с помощью модернизации - PullRequest
1 голос
/ 07 июля 2019

Я бы хотел получать почасовые данные из API прогноза, и я получаю сообщение об ошибке

java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 221 path $.list[0].weather

Это немного странно, если честно, или я просто не понимаю POJO вообще.Итак, я создал класс POJO

public class hourlyModel {

@SerializedName("list")
List<ListPOJO> listList;

public List<ListPOJO> getList() {
    return listList;
}

class ListPOJO{

    @SerializedName("main")
    Main main;
    @SerializedName("weather")
    Weather weather;
    @SerializedName("wind")
    Wind wind;

    @SerializedName("dt")
    long time;

    public Main getMain() {
        return main;
    }

    public Weather getWeather() {
        return weather;
    }

    public Wind getWind() {
        return wind;
    }

    public long getTime() {
        return time;
    }
}

class Main {

    @SerializedName("temp")
    private Double actualTemperature;
    @SerializedName("pressure")
    private Double airPressure;
    @SerializedName("humidity")
    private Double airHumidity;
    @SerializedName("temp_min")
    private Double minTemp;
    @SerializedName("temp_max")
    private Double maxTemp;

    public Double getActualTemperature() {
        return actualTemperature;
    }

    public Double getAirPressure() {
        return airPressure;
    }

    public Double getAirHumidity() {
        return airHumidity;
    }

    public Double getMinTemp() {
        return minTemp;
    }

    public Double getMaxTemp() {
        return maxTemp;
    }
}

class Wind{
    @SerializedName("speed")
    private Double windSpeed;

    public Double getWindSpeed() {
        return windSpeed;
    }
}


class Weather{
    @SerializedName("icon")
    private String forecastIcon;

    public String getForecastIcon() {
        return forecastIcon;
    }
}

для извлечения данных из этого ответа JSON

 {
  "cod": "200",
  "message": 0.006,
  "cnt": 40,
  "list": [
    {
      "dt": 1562522400,
      "main": {
        "temp": 12.29,
        "temp_min": 12.29,
        "temp_max": 17.05,
        "pressure": 1010.39,
        "sea_level": 1010.39,
        "grnd_level": 973.92,
        "humidity": 98,
        "temp_kf": -4.76
      },
      "weather": [
        {
          "id": 501,
          "main": "Rain",
          "description": "moderate rain",
          "icon": "10d"
        }
      ],
      "clouds": {
        "all": 100
      },
      "wind": {
        "speed": 1.23,
        "deg": 113.621
      },
      "rain": {
        "3h": 6.687
      },
      "sys": {
        "pod": "d"
      },
      "dt_txt": "2019-07-07 18:00:00"
    },
    and so on...

Я вызываю его в следующем методе

public void retrofitCall(){
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("https://openweathermap.org/data/2.5/")
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        ApiCalls api = retrofit.create(ApiCalls.class);
        Call<hourlyModel> call = api.getHourlyForecast(latitude,longitude,APP_ID);
        call.enqueue(new Callback<hourlyModel>() {
                @Override
                public void onResponse(Call<hourlyModel> call, Response<hourlyModel> response) {
                        if (!response.isSuccessful()){
                                Log.i(TAG, "onResponse: "+response.code());
                        }
                    Log.i(TAG, "onResponse: "+response.code());

                    List<hourlyModel.ListPOJO> list = response.body().getList();

                    for (hourlyModel.ListPOJO model: list){
                            temperatureString = String.valueOf(model.getMain().getActualTemperature());
                            System.out.println(temperatureString+"\n");
                        }
                }
                @Override
                public void onFailure(Call<hourlyModel> call, Throwable t) {
                        Log.i(TAG, "onFailure: "+t.getMessage());
                }
        });

Почему я получаю эту ошибку?Разве мне не нужно сначала войти в объект массива list, а оттуда вызвать любые данные, которые мне нужны?

Ответы [ 2 ]

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

Ваша ошибка говорит о том, что он ожидает массив погоды, но в вашем классе вы объявили его как объект Weather weather.Вы должны объявить его как List<Weather>, поскольку JSON содержит массив погоды.

0 голосов
/ 07 июля 2019

Изменение с

class ListPOJO {

    // Other fields

    @SerializedName("weather")
    Weather weather;

    // Other fields
}

Для

class ListPOJO {

    // Other fields

    @SerializedName("weather")
    List<Weather> weather;

    // Other fields
}
...