android json gson retrofit2

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.

  1. Seleccione el idioma de destino como JAVA,
  2. Tipo de fuente como JSON
  3. Estilo de anotación como Gson
  4. y marque Usar tipos primitivos, incluir captadores y definidores, permitir propiedades adicionales