首页 > 解决方案 > Android 嵌套对象和 Retrofit2

问题描述

我正在阅读这样的 JSON:

{
"matches": [{
    "id": 246119,
    "utcDate": "2018-08-17T18:15:00Z",
    "status": "FINISHED",
    "homeTeam": {
        "id": 298,
        "name": "Girona FC"
    },
    "awayTeam": {
        "id": 250,
        "name": "Real Valladolid CF"
    },
    "score": {
        "winner": "DRAW",
        "duration": "REGULAR"
    }
}]
}

我必须说 JSON 是有效的。我正在通过 API 使用这个 JSON。我可以正确读取属性“id”、“utc”和“status”,但不能正确读取“score”、“awayTeam”和“homeTeam”。我真的不知道如何使用这些属性。我想分别处理 score、awayTeam 和 homeTeam 的每个属性,例如,我想只获取 awayTeam 和 homeTeam 的名称以及 score 的 2 个属性。

这是我的代码:

主要活动

public class MainActivity extends AppCompatActivity {

    private Retrofit retrofit;
    private static final String TAG = "Football";
    private RecyclerView recyclerView;
    private ListaPartidosAdapter listaPartidosAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        recyclerView = (RecyclerView)findViewById(R.id.recyclerView);
        listaPartidosAdapter = new ListaPartidosAdapter(this);
        recyclerView.setAdapter(listaPartidosAdapter);
        recyclerView.setHasFixedSize(true);
        final LinearLayoutManager layoutManager = new LinearLayoutManager(this, VERTICAL, true);
        recyclerView.setLayoutManager(layoutManager);

        retrofit = new Retrofit.Builder()
                .baseUrl("http://api.football-data.org/v2/")
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        obtenerDatos();
    }

    private void obtenerDatos() {

        footballdataService service = retrofit.create(footballdataService.class);
        Call<PartidosRespuesta> partidosRespuestaCall = service.obtenerlistaPartidos();

        partidosRespuestaCall.enqueue(new Callback<PartidosRespuesta>() {
            @Override
            public void onResponse(Call<PartidosRespuesta> call, Response<PartidosRespuesta> response) {
                if(response.isSuccessful()) {
                    PartidosRespuesta partidosRespuesta = response.body();
                    ArrayList<Partido> listaPartidos = partidosRespuesta.getMatches();

                    listaPartidosAdapter.adicionarListaPartidos(listaPartidos);

                }
                else {
                    Log.e(TAG, "onResponse: " + response.errorBody());
                }
            }

            @Override
            public void onFailure(Call<PartidosRespuesta> call, Throwable t) {
                Log.e(TAG, "onFailure: " + t.getMessage());
            }
        });
    }
}

现在这是我的界面。足球数据服务

public interface footballdataService {
    @GET("competitions/2014/matches")
    Call<PartidosRespuesta> obtenerlistaPartidos();
}

这是 PartidosRespuestas 类

public class PartidosRespuesta {
    private ArrayList<Partido> matches;

    public ArrayList<Partido> getMatches() {
        return matches;
    }

    public void setMatches(ArrayList<Partido> matches) {
        this.matches = matches;
    }
}

这,就是适配器。

public class ListaPartidosAdapter extends RecyclerView.Adapter<ListaPartidosAdapter.ViewHolder> {

    private static final String TAG = "Football_Adapter";
    private ArrayList<Partido> dataset;
    private Context context;

    public ListaPartidosAdapter(Context context) {
        this.context = context;
        dataset = new ArrayList<Partido>();
    }

    @Override
    public ListaPartidosAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_partidos, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(ListaPartidosAdapter.ViewHolder holder, int position) {
        Partido p = dataset.get(position);
        holder.status.setText(p.getId());
    }

    @Override
    public int getItemCount() {
        return dataset.size();
    }

    public void adicionarListaPartidos(ArrayList<Partido> listaPartidos){
        dataset.addAll(listaPartidos);
        notifyDataSetChanged();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {

        private TextView status;

        public ViewHolder(View itemView) {
            super(itemView);

            status = (TextView) itemView.findViewById(R.id.status);
        }
    }
}

而这..,是Partido类

public class Partido {
    private String id;
    private String utcDate;
    private String status;
    private EquipoCasa homeTeam;
    private EquipoVisita AwayTeam;
    private Puntaje score;

    public String getId() {
        return id;
    }

    public String getUtcDate() {
        return utcDate;
    }

    public String getStatus() {
        return status;
    }

    public EquipoCasa getHomeTeam() {
        return homeTeam;
    }

    public EquipoVisita getAwayTeam() {
        return AwayTeam;
    }

    public Puntaje getScore() {
        return score;
    }

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

    public void setUtcDate(String utcDate) {
        this.utcDate = utcDate;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public void setHomeTeam(EquipoCasa homeTeam) {
        this.homeTeam = homeTeam;
    }

    public void setAwayTeam(EquipoVisita awayTeam) {
        AwayTeam = awayTeam;
    }

    public void setScore(Puntaje score) {
        this.score = score;
    }

    public class EquipoCasa {

        private String id;
        private String name;

        public String getId() {
            return id;
        }

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

        public String getName() {
            return name;
        }

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

    public class EquipoVisita {
        private String id;
        private String name;

        public String getId() {
            return id;
        }

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

        public String getName() {
            return name;
        }

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

    public class Puntaje {
        private String winner;
        private String duration;

        public String getWinner() {
            return winner;
        }

        public void setWinner(String winner) {
            this.winner = winner;
        }

        public String getDuration() {
            return duration;
        }

        public void setDuration(String duration) {
            this.duration = duration;
        }
    }
}

标签: androidjsonapigsonretrofit2

解决方案


您的代码的 POJO 类应该是这样的:

AwayTeam.java

//AwayTeam
public class AwayTeam {

   @SerializedName("id")
   @Expose
   private Integer id;
   @SerializedName("name")
   @Expose
   private String name;

   public Integer getId() {
      return id;
   }

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

   public String getName() {
      return name;
   }

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

}

PartidosRespuesta.java

//Object response
public class PartidosRespuesta {

   @SerializedName("matches")
   @Expose
   private List<Match> matches = null;

   public List<Match> getMatches() {
      return matches;
   }

   public void setMatches(List<Match> matches) {
      this.matches = matches;
   }

}

HomeTeam.java

//HomeTeam
public class HomeTeam {

   @SerializedName("id")
   @Expose
   private Integer id;
   @SerializedName("name")
   @Expose
   private String name;

   public Integer getId() {
      return id;
   }

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

   public String getName() {
      return name;
   }

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

}

分数.java

//Score
public class Score {

   @SerializedName("winner")
   @Expose
   private String winner;
   @SerializedName("duration")
   @Expose
   private String duration;

   public String getWinner() {
      return winner;
   }

   public void setWinner(String winner) {
      this.winner = winner;
   }

   public String getDuration() {
      return duration;
   }

   public void setDuration(String duration) {
      this.duration = duration;
   }

}

编辑:

@Override
public void onBindViewHolder(ListaPartidosAdapter.ViewHolder holder, int position) {
    Partido p = dataset.get(position);
    HomeTeam homeTeam = p.getHomeTeam();
    String nameHomeTeam = homeTeam.getName();

}

和工具将json转换为java代码: http: //www.jsonschema2pojo.org/


推荐阅读