How to grab JSON Array and use gson to parse each json object? (Retrofit)

后端 未结 4 1432
忘掉有多难
忘掉有多难 2020-12-30 23:05

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... th

相关标签:
4条回答
  • 2020-12-30 23:39

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

    new Callback<List<ObjResponse>>() {
    
    0 讨论(0)
  • 2020-12-30 23:47

    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.

    0 讨论(0)
  • 2020-12-30 23:54

    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);
    
    0 讨论(0)
  • 2020-12-31 00:00

    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.

    0 讨论(0)
提交回复
热议问题