Domanda

I am returning an array of results with my json Objects, and I am trying to use my customObjectResponse class to pull out each of the fields within each of the objects... the problem it is expecting an object so how do I edit my class to allow it to take in an array of object to be able to then call the fields of each object... I am confused as to what needs to be added:

Here is a response example of what is being passed to be used:

[
  {
    itemId: 'dfsdfsdf343434',
    name: 'tests',
    picture: '6976-7jv8h5.jpg',
    description: 'testy.',
    dateUpdated: 1395101819,

  }
]

Here is my response Object Class:

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;
    }

}

what I am trying, but is not working, even if I separate the classes into their own files:

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;
        }
}
È stato utile?

Soluzione

I ended up just calling in the callback a list of the customObject and it did the job...

new Callback<List<ObjResponse>>() {

Altri suggerimenti

I originally had trouble getting an idea of how the OP solved his problem but, after days of debugging I have finally figured out how to solve this issue.

So you essentially have data in the format like so (JSON Array of JSON Objects):

[
    {
      ...
    }
] 

Your class that models the data and contains the getter and setter methods are nothing more than your typical POJO.

public class Person implements Serializable {
    @SerializedName("Exact format of your json field name goes here")
    private String firstName;

    // Getters and Setters....
}

In your interface that contains your RESTful annotations you want to convert your call from:

Before:

public interface APInterface {
    @GET("SOME URL TO YOUR JSON ARRAY")
    Call<Person>(...)
}

After:

public interface APInterface {
    @GET("SOME URL TO YOUR JSON ARRAY")
    Call<List<Person>>(...)
}

In your android activity you want to convert all calls in the form of Call<Person> to Call<List<Person>>

Finally when making the initial asynchronous request call, you will want to convert your callbacks like so.

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) {...}
});

Hope this helps others whom are lost from the accepted answer above.

This can also work by just passing an array of response objects. So if this is your response object:

public class CustomUserResponse {
    public String firstName;
    public String lastName;
    ...
}

You can use related syntax, depending on how you use the callbacks. Such as:

new Callback<CustomUserResponse[]>(){
    @Override
    public void success(CustomUserResponse[] customUserResponses, Response rawResponse) {

    }

    @Override
    public void failure(RetrofitError error) {

    }
};

OR

public class GetUserCommand implements Callback<CustomUserResponse[]> { ...

Put simply, in every place where you normally replace T with a response class, replace it with an array, instead as in CustomUserResponse[].


NOTE: to avoid confusing errors, be sure to also use an array in the Retrofit interface definition:

@POST ( "/users" )
public void listUsers(@Body GetUsersRequest request, Callback<CustomUserResponse[]> callback);

You could try something like this

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);
}

This should definitely work.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top