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
- Uso de MultipartTypedOutput
- Encadenamiento de dos llamadas de servicio web mediante RxJava y Retrofit
- Deserializador de Gson con el convertidor de Retrofit: solo necesita JSON interno para todas las respuestas
- Configuración de Android studio 1.1.0 minifyEnabled true causando problemas con la aplicación
- Retrofit - Los parámetros de @Body no se pueden usar con codificación de formularios o multipartes
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 $
- Encadenamiento de llamadas de Retrofit con RxJava y devolución del objeto principal
- Añadir Retrofit Requestinterceptor con Dagger en tiempo de ejecución
- Consulta GET con json - Retrofit 2.0
- ¿Tenemos alguna posibilidad de detener la solicitud en OkHttp Interceptor?
- Análisis de GSON con Retrofit analizando la respuesta Flickr JSON
- Vimeo error de SSL con Retrofit en Android
- Patrón de repositorio con SqlBrite / SqlDelight (base de datos sin conexión) y Retrofit (solicitud Http)
- Cómo POST JSON todo en bruto en el cuerpo de una solicitud de Retrofit?
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);
- Desactivar el GPS mediante programación cuando salgo de mi programa
- Cómo compartir la imagen http directamente a twitter en android?