我有一个看起来像这样的JSON响应:
{\"场地\":[{\"id\":1,\"photo\":\"https://s3.us-east-2.amazonaws.com" }, ....
它有一个关键的"场地",然后是一个对象数组。在改造响应中:
public void onResponse(Call<List<Venue>> call, Response<List<Venue>> response) {
venues = response.body();
venueAdapter.notifyDataSetChanged();
}
它失败并显示:
java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $
问题是我不知道如何告诉 Retrofit 针对"场地"关键指向的集合。我该怎么做?我不想仅仅因为这个 JSON 响应而创建另一个类场所。
在你的代码中尝试这样。
响应场地类
public class ResponseVenue {
private List<VenuesBean> venues;
public List<VenuesBean> getVenues() {
return venues;
}
public void setVenues(List<VenuesBean> venues) {
this.venues = venues;
}
public static class VenuesBean {
/**
* id : 1
* photo : https: //s3.us-east-2.amazonaws.com
*/
private int id;
private String photo;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getPhoto() {
return photo;
}
public void setPhoto(String photo) {
this.photo = photo;
}
}
}
然后在您的代码中使用 .
public void onResponse(Call<ResponseVenue> call, Response<ResponseVenue> response) {
venues = response.body();
venueAdapter.notifyDataSetChanged();
}
Post Venue pojo class。我认为你的pojo与响应json不匹配。
只需替换
onResponse(Call<List<Venue>> call, Response<List<Venue>> response)
自
onResponse(Call<Venue> call, Response<Venue> response)
并且还在改造的API界面中删除列表并仅制作场地
您的改造响应已为此 json 输出设置:
[{\"id\":1,\"photo\":\"https://s3.us-east-2.amazonaws.com" }, ....]
它直接将对象映射到列表中。如果您只有一个数组,那么您可以像这样更改 json 响应,但如果此 json 响应中有另一个键值对,那么您应该尝试@KeLiuyue答案。创建一个场地响应 pojo 类,它包含一个列表字段来保存您的场地 pojo 类。
在此之后,像这样检索您的场地Pojo:
public void onResponse(Call<ResponseVenue> call, Response<ResponseVenue> response) {
venues = response.body().getVenues();
venueAdapter.notifyDataSetChanged();
}