android - Parse respuesta de matriz JSON usando Retrofit y Gson
retrofit2 (3)
Cree debajo de la clase en su paquete modelo:
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;
}
}
Establecer arriba SponsorsModel en su resultado.
Gracias
Aquí está mi respuesta JSONArray del servicio web:
[
{
"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"
}
]
Aquí está ApiInterface.java
public interface ApiInterface {
@GET("bills/")
Call<SponsorsResult> getListOfSponsors(@Query("bill_id") String billId , @Query("session") String session, @Query("fields") String field);
}
Y aquí está la llamada del método y la respuesta:
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();
}
});
A partir de ahora falla y aquí está la salida de logcat:
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $
No puede ejecutar la respuesta. Guíame para analizar esta respuesta.
Intenta usar este
@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;
}
}
Avíseme si tiene algún problema.
Puede crear clases POJO a partir de la respuesta json automáticamente usando este enlace -> jsonschema2pojo
Todo lo que necesita hacer es pegar la respuesta JSON en el cuadro de edición dado.
- Seleccione el idioma de destino como JAVA,
- Tipo de fuente como JSON
- Estilo de anotación como Gson
- y marque Usar tipos primitivos, incluir captadores y definidores, permitir propiedades adicionales