Ответ 1
В итоге я просто вызывал в обратном вызове список customObject и выполнял эту работу...
new Callback<List<ObjResponse>>() {
Я возвращаю массив результатов с моими объектами json, и я пытаюсь использовать свой класс customObjectResponse для извлечения каждого из полей в каждом из объектов... проблема в том, что он ожидает объект, так как мне отредактировать мой класс чтобы он мог принимать массив объектов, чтобы потом вызывать поля каждого объекта... Я не понимаю, что нужно добавить:
Вот ответный пример того, что передается для использования:
[
{
itemId: 'dfsdfsdf343434',
name: 'tests',
picture: '6976-7jv8h5.jpg',
description: 'testy.',
dateUpdated: 1395101819,
}
]
Вот мой класс объектов ответа:
public class ObjResponse{
private String itemId;
private String name;
private String picture;
private String description;
private String location;
private int dateUpdated;
private String msg;
//gridview constructor
public ObjResponse(String picture) {
this.picture = picture;
}
//public constructor
public ObjResponse() {
}
public String getItemId() {
return itemId;
}
public void setItemId(String itemId) {
this.itemId = itemId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPicture() {
return picture;
}
public void setPicture(String picture) {
this.picture = picture;
}
public String getLocation() {
return location;
}
public void setLocation(String location) {
this.location = location;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public int getDateUpdated() {
return dateUpdated;
}
public void setDateUpdated(int dateUpdated) {
this.dateUpdated = dateUpdated;
}
public String getMsg() {
return msg;
}
}
что я пытаюсь, но не работает, даже если я разделяю классы на свои файлы:
Data passed in:
items: [{obj1: "A", obj2: ["c", "d"]}, {etc...}]
public class Response {
public class List<Custom> {
private List<Custom> items;
}
public class Custom {
private String obj1;
private List<Obj2> obj2;
}
public Class Obj2 {
private String letters;
}
}
В итоге я просто вызывал в обратном вызове список customObject и выполнял эту работу...
new Callback<List<ObjResponse>>() {
Мне изначально не удалось понять, как OP
решил свою проблему, но после нескольких дней отладки я наконец выяснил, как решить эту проблему.
Итак, у вас есть данные в таком формате (JSON Array от объектов JSON):
[
{
...
}
]
Ваш класс, который моделирует данные и содержит методы getter и setter, является не чем иным, как типичным POJO.
public class Person implements Serializable {
@SerializedName("Exact format of your json field name goes here")
private String firstName;
// Getters and Setters....
}
В вашем интерфейсе, который содержит ваши аннотации RESTful, вы хотите конвертировать свой вызов из:
До:
public interface APInterface {
@GET("SOME URL TO YOUR JSON ARRAY")
Call<Person>(...)
}
После:
public interface APInterface {
@GET("SOME URL TO YOUR JSON ARRAY")
Call<List<Person>>(...)
}
В вашей активности Android вы хотите преобразовать все вызовы в форме Call<Person>
в Call<List<Person>>
Наконец, при выполнении начального асинхронного запроса запроса вам нужно будет конвертировать ваши обратные вызовы.
call.enqueue(new Callback<List<Person>>() {
@Override
public void onResponse(Call<List<Person>> call, Response<List<Person>> response) {
if(response.isSuccessful()){
List<Person> person = response.body();
// Can iterate through list and grab Getters from POJO
for(Person p: person){...}
} else {
// Error response...
}
}
@Override
public void onFailure(Call<List<Person>> call, Throwable t) {...}
});
Надеюсь, это поможет другим, кто потерян из принятого ответа выше.
Это также может работать, просто передав массив объектов ответа. Итак, если это ваш объект ответа:
public class CustomUserResponse {
public String firstName;
public String lastName;
...
}
Вы можете использовать связанный синтаксис, в зависимости от того, как вы используете обратные вызовы. Например:
new Callback<CustomUserResponse[]>(){
@Override
public void success(CustomUserResponse[] customUserResponses, Response rawResponse) {
}
@Override
public void failure(RetrofitError error) {
}
};
ИЛИ
public class GetUserCommand implements Callback<CustomUserResponse[]> { ...
Проще говоря, в любом месте, где вы обычно заменяете класс T
классом ответа, замените его массивом, а не как CustomUserResponse[]
.
ПРИМЕЧАНИЕ. Чтобы избежать ошибок при запуске, обязательно используйте массив в определении интерфейса Retrofit
:
@POST ( "/users" )
public void listUsers(@Body GetUsersRequest request, Callback<CustomUserResponse[]> callback);
Вы можете попробовать что-то вроде этого
JSONObject jsonObject = new JSONObject(<your JSON string result>);
JSONArray jsonArray = jsonObject.getJSONArray();
//use GSON to parse
if (jsonArray != null) {
Gson gson = new Gson();
ObjResponse[] objResponse = gson.fromJson(jsonArray.toString(), ObjResponse[].class);
List<ObjResponse> objResponseList = Arrays.asList(objResponse);
}
Это обязательно должно работать.