Проблемы с Android при получении параметра внутреннего списка из gson - PullRequest
0 голосов
/ 16 сентября 2018

поэтому URL-адрес json, который я пытаюсь проанализировать с помощью модернизации, таков: https://samples.openweathermap.org/data/2.5/weather?q=London,uk&appid=b6907d289e10d714a6e88b30761fae22

мой код файла MainActivity java выглядит следующим образом:

public class MainActivity extends AppCompatActivity {

TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    textView = findViewById(R.id.tvHelloWorld);

    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(Api.BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .build();

    Api api = retrofit.create(Api.class);

    Call<WeatherParams> call = api.getWeather();

    call.enqueue(new Callback<WeatherParams>() {
        @Override
        public void onResponse(Call<WeatherParams> call, Response<WeatherParams> response) {
            WeatherParams weatherParams = response.body();
            textView.setText(String.valueOf(weatherParams.getWeather()));

        }

        @Override
        public void onFailure(Call<WeatherParams> call, Throwable t) {

        }
    });
}

мой код интерфейса API:

public interface Api {

String BASE_URL = "https://samples.openweathermap.org/data/2.5/";

@GET("weather?q=London,uk&appid=b6907d289e10d714a6e88b30761fae22")
Call<WeatherParams> getWeather();

}

мой класс WeatherParams:

public class WeatherParams {

@SerializedName("dt")
private int dt;

@SerializedName("coord")
private Coord coord;

@SerializedName("visibility")
private int visibility;

@SerializedName("weather")
private WeatherItem weather;

@SerializedName("name")
private String name;

@SerializedName("cod")
private int cod;

@SerializedName("main")
private Main main;

@SerializedName("clouds")
private Clouds clouds;

@SerializedName("id")
private int id;

@SerializedName("sys")
private Sys sys;

@SerializedName("base")
private String base;

@SerializedName("wind")
private Wind wind;

public void setDt(int dt) {
    this.dt = dt;
}

public int getDt() {
    return dt;
}

public void setCoord(Coord coord) {
    this.coord = coord;
}

public Coord getCoord() {
    return coord;
}

public void setVisibility(int visibility) {
    this.visibility = visibility;
}

public int getVisibility() {
    return visibility;
}

public void setWeather(WeatherItem weather) {
    this.weather = weather;
}

public WeatherItem getWeather() {
    return weather;
}

public void setName(String name) {
    this.name = name;
}

public String getName() {
    return name;
}

public void setCod(int cod) {
    this.cod = cod;
}

public int getCod() {
    return cod;
}

public void setMain(Main main) {
    this.main = main;
}

public Main getMain() {
    return main;
}

public void setClouds(Clouds clouds) {
    this.clouds = clouds;
}

public Clouds getClouds() {
    return clouds;
}

public void setId(int id) {
    this.id = id;
}

public int getId() {
    return id;
}

public void setSys(Sys sys) {
    this.sys = sys;
}

public Sys getSys() {
    return sys;
}

public void setBase(String base) {
    this.base = base;
}

public String getBase() {
    return base;
}

public void setWind(Wind wind) {
    this.wind = wind;
}

public Wind getWind() {
    return wind;
}

@Override
public String toString() {
    return
            "WeatherParams{" +
                    "dt = '" + dt + '\'' +
                    ",coord = '" + coord + '\'' +
                    ",visibility = '" + visibility + '\'' +
                    ",weather = '" + weather + '\'' +
                    ",name = '" + name + '\'' +
                    ",cod = '" + cod + '\'' +
                    ",main = '" + main + '\'' +
                    ",clouds = '" + clouds + '\'' +
                    ",id = '" + id + '\'' +
                    ",sys = '" + sys + '\'' +
                    ",base = '" + base + '\'' +
                    ",wind = '" + wind + '\'' +
                    "}";
}

}

и, наконец, мой объект класса WeatherItem:

public class WeatherItem{

@SerializedName("icon")
private String icon;

@SerializedName("description")
private String description;

@SerializedName("main")
private String main;

@SerializedName("id")
private int id;

public void setIcon(String icon){
    this.icon = icon;
}

public String getIcon(){
    return icon;
}

public void setDescription(String description){
    this.description = description;
}

public String getDescription(){
    return description;
}

public void setMain(String main){
    this.main = main;
}

public String getMain(){
    return main;
}

public void setId(int id){
    this.id = id;
}

public int getId(){
    return id;
}

@Override
public String toString(){
    return 
        "WeatherItem{" + 
        "icon = '" + icon + '\'' + 
        ",description = '" + description + '\'' + 
        ",main = '" + main + '\'' + 
        ",id = '" + id + '\'' + 
        "}";
    }

Все, что я пытаюсь получить, это метод getDescription на WeatherItem.

Я установил строку равной response.body (), после этого я установил текстовое представление равным этой строке, но эта строка содержит список элементов погоды, поэтому я не могу добраться до getDescriptionметод одиночного weatherItem.

У кого-нибудь есть идеи?

1 Ответ

0 голосов
/ 16 сентября 2018

Вы должны изменить свой WeatherParams.В предоставленной вами модели json поле weather является массивом, а в вашем текущем классе WeatherParams это один объект.Ваш класс WeatherParams должен выглядеть следующим образом:

private class WeatherParams{
   //other members 
   @SerializedName("weather")
   private List<WeatherItem> weather;
}

Тогда вы можете вызывать функцию getDescription для любого нужного вам элемента, вызывая его через WeatherParams.getWeather().get(itemIndex)

...