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.
- Select Target language as JAVA,
- Source type as JSON
- Annotation style as Gson
- 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
Comments
-
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 about 7 yearsTried your code but still getting java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at
-
Jd Prajapati about 7 yearsare you sure in your response its start and end with [ ]? your response start with object not array...this is the issue
-
Deepak G over 6 yearsYou can name the classes as per your conventions.
-
Mert Kahraman almost 6 yearsThese 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 over 5 yearsI had no idea this existed, even though it makes so much sense. Thanks for sharing this!
-
Benny over 4 yearsHi 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 over 3 yearsWorks perfectly 👍👍
-
Robby Lebotha over 2 yearsThis is the best answer, worked for me althought I used <ArrayList>.