【问题标题】:Android Nested Objects and Retrofit2Android 嵌套对象和 Retrofit2
【发布时间】:2023-04-01 21:44:01
【问题描述】:

我正在阅读这样的 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;
        }
    }
}

【问题讨论】:

    标签: android json api gson retrofit2


    【解决方案1】:

    你的代码的 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;
       }
    
    }
    

    Score.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/

    【讨论】:

    • Partido p = dataset.get(position);主队主队 = p.getHomeTeam();字符串名称HomeTeam = homeTeam.getName()
    【解决方案2】:

    试试

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

    【讨论】:

    • 是的..,我在 Partidos 类文件的末尾找到了它
    【解决方案3】:

    您的模型似乎有问题。使用此 link 将您的 json 转换为 java 对象。

    【讨论】:

      猜你喜欢
      • 2020-03-07
      • 1970-01-01
      • 2020-01-13
      • 1970-01-01
      • 2011-01-26
      • 2013-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多