Parse JSON array response using Retrofit & Gson

54,878

Solution 1

Please try to use this one

    @FormUrlEncoded
    @POST("api/sponsors")
    Call<List<SponsorsResult>> getStatesAndDistrict(
            @Field("xyz") String field1
    );



   Call <List<SponsorsResult>> call = service.getSponsorsValue();

    call.enqueue(new Callback<List<SponsorsResult>>() {
        @Override
        public void onResponse(Call<List<SponsorsResult>> call, Response<List<SponsorsResult>> response) {

            List<SponsorsResult> rs = response.body();

        }

        @Override
        public void onFailure(Call<List<SponsorsResult>> call, Throwable t) {

        }
    });



 class SponsorsResult {

    @SerializedName("sponsors")
    private List<SponsorsValue> sponsors;

    public List<SponsorsValue> getSponsors() {
        return sponsors;
    }
}

class SponsorsValue{
    @SerializedName("leg_id")
    @Expose
    private String legId;
    @SerializedName("type")
    @Expose
    private String type;
    @SerializedName("name")
    @Expose
    private String name;

    public String getLegId() {
        return legId;
    }

    public void setLegId(String legId) {
        this.legId = legId;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

Please let me know if you are facing any issue.

Solution 2

You can create POJO classes from json response automatically using this link -> jsonschema2pojo

All you need to do is paste the JSON response in the edit box given.

  1. Select Target language as JAVA,
  2. Source type as JSON
  3. Annotation style as Gson
  4. and check Use primitive types , include getters and setters, allow additional properties

Solution 3

The short answer is. if your JSON response starts with a JSON array, use a List:

@GET("bills/")
Call<List<YourResponse>> getListOfSponsors(....);

vs wrong:

@GET("bills/")
Call<YourResponse> getListOfSponsors(....);

Solution 4

Create below class in your model package:

 import java.util.List;
 import com.google.gson.annotations.Expose;
 import com.google.gson.annotations.SerializedName;

public class SponsorModel {

 @SerializedName("sponsors")
@Expose
private List<Sponsor> sponsors = null;
@SerializedName("id")
@Expose
private String id;

public List<Sponsor> getSponsors() {
    return sponsors;
}

public void setSponsors(List<Sponsor> sponsors) {
    this.sponsors = sponsors;
}

public String getId() {
    return id;
}

public void setId(String id) {
    this.id = id;
}

}

-----------------------------------Sponsor.java-----------------------------------

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class Sponsor {

@SerializedName("leg_id")
@Expose
private String legId;
@SerializedName("type")
@Expose
private String type;
@SerializedName("name")
@Expose
private String name;
@SerializedName("committee_id")
@Expose
private Object committeeId;
@SerializedName("official_type")
@Expose
private String officialType;

public String getLegId() {
    return legId;
}

public void setLegId(String legId) {
    this.legId = legId;
}

public String getType() {
    return type;
}

public void setType(String type) {
    this.type = type;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public Object getCommitteeId() {
    return committeeId;
}

public void setCommitteeId(Object committeeId) {
    this.committeeId = committeeId;
}

public String getOfficialType() {
    return officialType;
}

public void setOfficialType(String officialType) {
    this.officialType = officialType;
}

}

Set above SponsorsModel in your result.

Thanks

Share:
54,878
Deep Shah
Author by

Deep Shah

UX &amp; Visual Designer

Updated on September 23, 2020

Comments

  • Deep Shah
    Deep Shah over 3 years

    Here is my JSONArray Response from Web service:

    [
      {
        "sponsors": [
          {
            "leg_id": "NYL000067",
            "type": "primary",
            "name": "AUBRY"
          },
          {
            "leg_id": "NYL000171",
            "type": "cosponsor",
            "name": "PERRY"
          },
          {
            "leg_id": "NYL000066",
            "type": "cosponsor",
            "name": "ARROYO"
          },
          {
            "leg_id": "NYL000223",
            "type": "cosponsor",
            "name": "BARRETT"
          },
          {
            "leg_id": "NYL000312",
            "type": "cosponsor",
            "name": "STECK"
          },
          {
            "leg_id": "NYL000180",
            "type": "cosponsor",
            "name": "RIVERA"
          },
          {
            "leg_id": "NYL000114",
            "type": "cosponsor",
            "name": "GOTTFRIED"
          },
          {
            "leg_id": "NYL000091",
            "type": "cosponsor",
            "name": "COOK"
          },
          {
            "leg_id": "NYL000126",
            "type": "cosponsor",
            "name": "JAFFEE"
          },
          {
            "leg_id": "NYL000327",
            "type": "cosponsor",
            "name": "DAVILA"
          },
          {
            "leg_id": "NYL000144",
            "type": "cosponsor",
            "name": "LUPARDO"
          },
          {
            "leg_id": null,
            "type": "cosponsor",
            "name": "SEPULVEDA",
            "committee_id": null
          },
          {
            "leg_id": "NYL000290",
            "type": "cosponsor",
            "name": "MOSLEY"
          },
          {
            "leg_id": "NYL000167",
            "type": "cosponsor",
            "name": "ORTIZ"
          },
          {
            "leg_id": "NYL000170",
            "type": "cosponsor",
            "name": "PEOPLES-STOKES"
          },
          {
            "leg_id": "NYL000221",
            "type": "cosponsor",
            "name": "SKARTADOS"
          },
          {
            "leg_id": "NYL000216",
            "type": "cosponsor",
            "name": "QUART"
          },
          {
            "leg_id": "NYL000208",
            "type": "cosponsor",
            "name": "WEPRIN"
          },
          {
            "leg_id": "NYL000186",
            "type": "cosponsor",
            "name": "ROSENTHAL"
          },
          {
            "leg_id": "NYL000139",
            "type": "cosponsor",
            "name": "LIFTON"
          },
          {
            "leg_id": "NYL000064",
            "type": "cosponsor",
            "name": "ABINANTI"
          },
          {
            "leg_id": "NYL000173",
            "type": "cosponsor",
            "name": "PRETLOW"
          },
          {
            "leg_id": "NYL000339",
            "type": "cosponsor",
            "name": "BICHOTTE"
          },
          {
            "leg_id": null,
            "type": "cosponsor",
            "name": "BARRON",
            "committee_id": null
          },
          {
            "leg_id": "NYL000341",
            "type": "cosponsor",
            "name": "WALKER"
          },
          {
            "leg_id": "NYL000355",
            "type": "cosponsor",
            "name": "BLAKE"
          },
          {
            "leg_id": "NYL000185",
            "type": "cosponsor",
            "name": "RODRIGUEZ"
          },
          {
            "leg_id": "NYL000259",
            "type": "cosponsor",
            "name": "FAHY"
          },
          {
            "leg_id": "NYL000203",
            "type": "cosponsor",
            "name": "TITONE"
          },
          {
            "leg_id": "NYL000286",
            "type": "cosponsor",
            "name": "MCDONALD"
          },
          {
            "leg_id": "NYL000081",
            "type": "cosponsor",
            "name": "CAHILL"
          },
          {
            "leg_id": "NYL000421",
            "type": "cosponsor",
            "name": "HARRIS"
          },
          {
            "leg_id": "NYL000338",
            "type": "cosponsor",
            "name": "JOYNER"
          },
          {
            "leg_id": "NYL000448",
            "type": "cosponsor",
            "name": "JENNE"
          },
          {
            "leg_id": "NYL000070",
            "type": "cosponsor",
            "name": "BENEDETTO"
          },
          {
            "leg_id": "NYL000310",
            "type": "cosponsor",
            "name": "SOLAGES"
          },
          {
            "leg_id": "NYL000357",
            "type": "cosponsor",
            "name": "RICHARDSON"
          },
          {
            "leg_id": "NYL000324",
            "type": "cosponsor",
            "name": "PICHARDO"
          },
          {
            "leg_id": "NYL000423",
            "type": "cosponsor",
            "name": "HYNDMAN"
          },
          {
            "leg_id": "NYL000313",
            "type": "cosponsor",
            "name": "STIRPE"
          },
          {
            "leg_id": "NYL000131",
            "type": "cosponsor",
            "name": "KAVANAGH"
          },
          {
            "leg_id": "NYL000204",
            "type": "cosponsor",
            "name": "TITUS"
          },
          {
            "leg_id": "NYL000275",
            "type": "cosponsor",
            "name": "KIM"
          },
          {
            "leg_id": "NYL000195",
            "type": "cosponsor",
            "name": "SIMOTAS"
          },
          {
            "leg_id": "NYL000293",
            "type": "cosponsor",
            "name": "OTIS"
          },
          {
            "leg_id": "NYL000220",
            "type": "cosponsor",
            "name": "MAYER"
          },
          {
            "leg_id": "NYL000344",
            "type": "cosponsor",
            "name": "JEAN-PIERRE"
          }
        ],
        "id": "NYB00099404"
      },
      {
        "sponsors": [
          {
            "leg_id": "NJL000113",
            "type": "primary",
            "name": "Vainieri Huttle, Valerie"
          }
        ],
        "id": "NJB00038817"
      },
      {
        "sponsors": [
          {
            "leg_id": "NYL000208",
            "type": "primary",
            "name": "WEPRIN"
          }
        ],
        "id": "NYB00066288"
      },
      {
        "sponsors": [
          {
            "leg_id": "NJL000083",
            "type": "primary",
            "name": "Jasey, Mila M."
          },
          {
            "leg_id": "NJL000086",
            "type": "primary",
            "name": "Caputo, Ralph R."
          },
          {
            "leg_id": "NJL000046",
            "type": "primary",
            "name": "Watson Coleman, Bonnie"
          },
          {
            "leg_id": "NJL000177",
            "type": "primary",
            "name": "Pintor Marin, Eliana"
          },
          {
            "leg_id": "NJL000164",
            "type": "primary",
            "name": "Sumter, Shavonda E."
          },
          {
            "leg_id": "NJL000104",
            "type": "primary",
            "name": "Oliver, Sheila Y."
          },
          {
            "leg_id": "NJL000095",
            "type": "primary",
            "name": "Mainor, Charles"
          },
          {
            "leg_id": "NJL000165",
            "type": "primary",
            "name": "Wimberly, Benjie E."
          },
          {
            "leg_id": "NJL000016",
            "type": "cosponsor",
            "name": "Fuentes, Angel"
          },
          {
            "leg_id": "NJL000085",
            "type": "cosponsor",
            "name": "Tucker, Cleopatra G."
          },
          {
            "leg_id": "NJL000067",
            "type": "cosponsor",
            "name": "Stender, Linda"
          },
          {
            "leg_id": "NJL000114",
            "type": "cosponsor",
            "name": "Johnson, Gordon M."
          },
          {
            "leg_id": "NJL000082",
            "type": "cosponsor",
            "name": "McKeon, John F."
          },
          {
            "leg_id": "NJL000129",
            "type": "cosponsor",
            "name": "Singleton, Troy"
          }
        ],
        "id": "NJB00030216"
      },
      {
        "sponsors": [
          {
            "leg_id": "NYL000088",
            "official_type": "SPONSOR",
            "type": "primary",
            "name": "Clark"
          },
          {
            "leg_id": "NYL000171",
            "official_type": "COSPNSR",
            "type": "cosponsor",
            "name": "Perry"
          }
        ],
        "id": "NYB00035573"
      },
      {
        "sponsors": [
          {
            "leg_id": "NJL000111",
            "type": "primary",
            "name": "Schaer, Gary S."
          },
          {
            "leg_id": "NJL000018",
            "type": "primary",
            "name": "Lampitt, Pamela R."
          },
          {
            "leg_id": "NJL000105",
            "type": "primary",
            "name": "Giblin, Thomas P."
          },
          {
            "leg_id": "NJL000171",
            "type": "primary",
            "name": "Mosquera, Gabriela M."
          },
          {
            "leg_id": "NJL000011",
            "type": "cosponsor",
            "name": "Moriarty, Paul D."
          },
          {
            "leg_id": "NJL000165",
            "type": "cosponsor",
            "name": "Wimberly, Benjie E."
          },
          {
            "leg_id": "NJL000010",
            "type": "cosponsor",
            "name": "Madden, Fred H."
          },
          {
            "leg_id": "NJL000007",
            "type": "cosponsor",
            "name": "Sweeney, Stephen M."
          },
          {
            "leg_id": "NJL000039",
            "type": "cosponsor",
            "name": "Thompson, Samuel D."
          },
          {
            "leg_id": "NJL000112",
            "type": "cosponsor",
            "name": "Weinberg, Loretta"
          },
          {
            "leg_id": "NJL000087",
            "type": "cosponsor",
            "name": "Ruiz, M. Teresa"
          }
        ],
        "id": "NJB00021785"
      },
      {
        "sponsors": [
          {
            "leg_id": "NYL000138",
            "official_type": "SPONSOR",
            "type": "primary",
            "name": "Lentol"
          }
        ],
        "id": "NYB00010409"
      },
      {
        "sponsors": [
          {
            "leg_id": "NJL000028",
            "type": "primary",
            "name": "Gove, DiAnne C."
          },
          {
            "leg_id": "NJL000027",
            "type": "primary",
            "name": "Rumpf, Brian E."
          },
          {
            "leg_id": "NJL000099",
            "type": "cosponsor",
            "name": "Prieto, Vincent"
          }
        ],
        "id": "NJB00002928"
      },
      {
        "sponsors": [
          {
            "leg_id": "NJL000094",
            "type": "primary",
            "name": "Chiappone, Anthony"
          },
          {
            "leg_id": "NJL000034",
            "type": "cosponsor",
            "name": "Angelini, Mary Pat"
          }
        ],
        "id": "NJB00010952"
      }
    ]
    

    Here is ApiInterface.java

    public interface ApiInterface {
    
        @GET("bills/")
        Call<SponsorsResult> getListOfSponsors(@Query("bill_id") String billId , @Query("session") String session, @Query("fields") String field);
    
    }
    

    And here is call of method & response :

    ApiInterface apiService = ApiClient.getClient().create(ApiInterface.class);
    
    Call<SponsorsResult> call = apiService.getListOfSponsors(AppConstants.ASSEMBLY_BILL_ID,AppConstants.SESSION,AppConstants.FIELD);
    call.enqueue(new Callback<SponsorsResult>() {
        @Override
        public void onResponse(Call<SponsorsResult> call, Response<SponsorsResult> response) {
    
            Log.d(TAG,"Number :" + response.raw());
            List<Sponsor> sponsors = response.body().getSponsors();
            Log.d(TAG,"Number of sponsors :" + sponsors.size());
        }
    
        @Override
        public void onFailure(Call<SponsorsResult> call, Throwable t) {
            t.printStackTrace();
        }
    });
    

    As of now it fails & here is logcat output :

    com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $
    

    It fails to execute response . Guide me to parse this response.

  • Deep Shah
    Deep Shah about 7 years
    Tried your code but still getting java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at
  • Jd Prajapati
    Jd Prajapati about 7 years
    are you sure in your response its start and end with [ ]? your response start with object not array...this is the issue
  • Deepak G
    Deepak G over 6 years
    You can name the classes as per your conventions.
  • Mert Kahraman
    Mert Kahraman almost 6 years
    These intermediary objects are usually referred as Data Transformation Objects, DTOs - so just keep in mind if you ever need to search further about these.
  • Panos Gr
    Panos Gr over 5 years
    I had no idea this existed, even though it makes so much sense. Thanks for sharing this!
  • Benny
    Benny over 4 years
    Hi there, I have the same issue, I did as outlined above, and I am indeed getting several SponsorResult objects as a list, however, how do I extract the SponsorValue objects out of this afterwards? I tried to do so and I only receive null, as a result, what am I doing wrong? can someone give me an example on extracting the corresponding object's fields?
  • Makari Kevin
    Makari Kevin over 3 years
    Works perfectly 👍👍
  • Robby Lebotha
    Robby Lebotha over 2 years
    This is the best answer, worked for me althought I used <ArrayList>.