Не могу перебрать массив JSON - PullRequest
3 голосов
/ 08 июля 2019

У меня есть этот ответ JSON

    {
  "cod": "200",
  "message": 0.0085,
  "cnt": 40,
  "list": [
    {
      "dt": 1562533200,
      "main": {
        "temp": 15.55,
        "temp_min": 15.55,
        "temp_max": 15.96,
        "pressure": 1012.01,
        "sea_level": 1012.01,
        "grnd_level": 976.03,
        "humidity": 97,
        "temp_kf": -0.41
      },
      "weather": [
        {
          "id": 500,
          "main": "Rain",
          "description": "light rain",
          "icon": "10n"
        }
      ],
      "clouds": {
        "all": 100
      },

и так далее ... Как я могу получить данные из массива погоды? Я пробовал

    ArrayList<hourlyModel.Weather> list = new ArrayList<>();


 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 = (ArrayList<hourlyModel.Weather>) response.body().getWeather();

                        for (hourlyModel.Weather model : list){
                            forecastID = String.valueOf(model.getForecastIcon());
                            Toast.makeText(Hourly_weather.this,forecastID,Toast.LENGTH_LONG).show();
                        }
                }

Вот это POJO

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

public List<Weather> getWeather() {
    return weather;
}

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

 class ListPOJO{

    @SerializedName("main")
    Main main;

    @SerializedName("wind")
    Wind wind;

    @SerializedName("dt")
    long time;

    public Main getMain() {
        return main;
    }

    public List<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;
    }

    public Main(Double actualTemperature, Double airPressure, Double airHumidity) {
        this.actualTemperature = actualTemperature;
        this.airPressure = airPressure;
        this.airHumidity = airHumidity;
    //            this.weather.forecastIcon = forecastID;
    }
}

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

    public Double getWindSpeed() {
        return windSpeed;
    }
}


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

    public String getForecastIcon() {
        return forecastIcon;
    }
}

Полагаю, я бы хотел перейти на hourlyModel.ListPOJO -> Погода, но вроде не могу этого сделать. Получение этой ошибки Попытка вызвать виртуальный метод 'java.util.Iterator java.util.ArrayList.iterator ()' для ссылки на пустой объект. Что я должен изменить, чтобы он работал? Я не понимаю, почему я не могу добраться до второго массива из первого.

Ответы [ 4 ]

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

Ваш json не является действительным json, и вы можете использовать этот веб-сайт для преобразования действительного в объект Java: http://www.jsonschema2pojo.org/

Кроме того, ваше pojo неверно, поскольку list и weather не находятся на одном уровне.

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

Ваш JSON неполон. Используйте http://www.jsonschema2pojo.org/ для создания pojo, а затем попробуйте выполнить итерацию. Спасибо.

0 голосов
/ 08 июля 2019
     @SerializedName("list")
     List<ListPOJO> listList;

 class ListPOJO{

    @SerializedName("main")
    Main main;

    @SerializedName("wind")
    Wind wind;

    @SerializedName("dt")
    long time;@SerializedName("weather")
List<Weather> weather;

public List<Weather> getWeather() {
    return weather;
}

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



    public Main getMain() {
        return main;
    }

    public List<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;
    }

    public Main(Double actualTemperature, Double airPressure, Double airHumidity) {
        this.actualTemperature = actualTemperature;
        this.airPressure = airPressure;
        this.airHumidity = airHumidity;
    //            this.weather.forecastIcon = forecastID;
    }
}

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

    public Double getWindSpeed() {
        return windSpeed;
    }
}


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

    public String getForecastIcon() {
        return forecastIcon;
    }
}
0 голосов
/ 08 июля 2019

Попробуйте вместо этого list = response.body (). GetList (). GetWeather ();

...