Cubriendo json array utilizando retrofit?

Este es mi hijo

[ { "nata_center":{ "id":67, "nata_center_name":"Primo Institute of Design" } }, { "nata_center":{ "id":68, "nata_center_name":"Sai Ganesh Institute" } } ] 

Clases Pojo

 public class Explorer { NataCenter nataCenter; public NataCenter getNataCenter() { return nataCenter; } public void setNataCenter(NataCenter nataCenter) { this.nataCenter = nataCenter; } } 

2)

 public class NataCenter { public String id; public String nata_center_name; public NataCenter(String id,String nata_center_name) { this.id=id; this.nata_center_name=nata_center_name; } public void setId(String id) { this.id = id; } public String getId() { return id; } public String getNata_center_name() { return nata_center_name; } public void setNata_center_name(String nata_center_name) { this.nata_center_name = nata_center_name; } } 

GetMethhodinRetrofit

 void getCenter(@Query("id") int id,Callback<List<Explorer>> callback); 

MainActvitiy.java

  service.getCenter(i,new Callback<List<Explorer>>() { @Override public void success(List<Explorer> o, Response response) { Log.d(TAG,"Success" + "Response"+o.toString()); @Override public void failure(RetrofitError error) { Log.d(TAG,"Failed"+error.toString()); } }); 

Este es el mensaje de error

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

Básicamente, el problema es que tienes array como root en json. Tienes que crear el objeto que se utilizará como contenedor para esta lista y deserializator para este objeto. He utilizado Explorer como contenedor, se ve como a continuación:

 public class Explorer { List<NataCenter> nataCenter; public List<NataCenter> getNataCenter() { return nataCenter; } public void add(NataCenter nataCenterItem){ if(nataCenter == null){ nataCenter = new LinkedList<>(); } nataCenter.add(nataCenterItem); } } 

Mi solución es sólo una explicación. Puedes mejorar tu clase Explorer . Setter para la lista no es la mejor idea.

La clase NataCenter se parece a anterior,

El de pensar importante es ExplorerDeserializerJson clase. Se utiliza para deserializar json y se ve como a continuación:

 public class ExplorerDeserializerJson implements JsonDeserializer<Explorer> { @Override public Explorer deserialize(JsonElement je, Type type, JsonDeserializationContext jdc) throws JsonParseException { Explorer explorer = new Explorer(); JsonArray jsonArray = je.getAsJsonArray(); Gson gson = new Gson(); for(JsonElement element : jsonArray){ JsonObject jsonObject = element.getAsJsonObject(); NataCenter nataCenter = gson.fromJson(jsonObject.get("nata_center"), NataCenter.class); explorer.add(nataCenter); } return explorer; } } 

Además cambio su cliente. Ahora Explorer es una respuesta.

 void getCenter(@Query("id") int id,Callback<Explorer> callback); 

Como el último que tiene que registrar deserializer nuevo en el lugar donde se crea RestAdapter como se muestra a continuación:

  RestAdapter restAdapter = new RestAdapter.Builder() .setEndpoint(BuildConfig.IP) .setConverter(new GsonConverter(new GsonBuilder() .registerTypeAdapter(Explorer.class, new ExplorerDeserializerJson()) .create())) .build(); restAdapter.create(CenterClient.class).getCenter(1); 
  • Error de petición Uber
  • Solicitudes HTTP periódicas con RxJava y Retrofit
  • Problemas con los últimos frascos de Square - retrofit, okhttp, okio y okhttp-urlconnection
  • No se puede crear un conversor para mi clase en Android Retrofit2 converter-simplexml library
  • POST con Android Retrofit
  • ¿Existe algún patrón de desarrollo que pueda reemplazar un IntentService para las solicitudes de red?
  • ¿Por qué RxJava con Retrofit en Android doOnError () no funciona, pero el suscriptor onError no
  • Uso de subscribeOn con Retrofit
  • Retrofit POST con nombres de parámetros de cuerpo personalizados
  • Observer.onError disparando de manera incoherente
  • AbstractMethodError cuando se utiliza RxJavaCallAdapterFactory en Retrofit 2
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.