¿Cómo puede Retrofit 2.0 analizar objeto JSON anidado?

Nuestro equipo decide usar Retrofit 2.0 y estoy haciendo una investigación inicial en esta biblioteca. Como se indica en el título, quiero analizar algunos objetos anidados JSON a través de Retrofit 2.0 en nuestra aplicación para Android.

Por ejemplo, aquí hay un objeto JSON anidado con el formato:

{ "title": "Recent Uploads tagged android", "link": "https://www.flickr.com/photos/tags/android/", "description": "", "modified": "2015-10-05T05:30:01Z", "generator": "https://www.flickr.com/", "items": [ { "title": ... "link": ... "media": {"m":"This is the value I want to get:)"} "description": ... "published": ... "author": ... "author_id": ... "tags": ... }, {...}, ... ] } 

Estoy interesado en los objetos JSON dentro de la matriz de items . Observo que hay algunas publicaciones sobre analizar objetos JSON anidados a través de Retrofit 1.X, pero las últimas API de Retrofit 2.0 han cambiado mucho, lo que es confuso al adaptarlas a las nuevas API.

Dos posibles soluciones vienen a mi mente:

  1. Escribir mi propia fábrica convertidor JSON que extiende Converter.Factory .
  2. Devuelve la respuesta en bruto en un tipo String y analiza por mí mismo. Pero no es fácil obtener la respuesta bruta de Retrofit 2.0 de acuerdo con mi investigación inicial. Retrofit 2.0 parece insistir en la conversión de la respuesta a algo antes de pasarlo a mí y Retrofit no proporciona su propio StringConverter . (Yo podría estar equivocado ~)

Actualización: Realmente podemos obtener la respuesta raw estableciendo JSONElement como el pojo para la interfaz HTTP API y usar GSONConverter proporcionado por Retrofit como el convertidor.

Sería genial si alguien puede compartir algunas ideas sobre este tema.

Gracias:)

Asumiendo que su JSON completo parece

 { "title": "Recent Uploads tagged android", "link": "https://www.flickr.com/photos/tags/android/", "description": "", "modified": "2015-10-05T05:30:01Z", "generator": "https://www.flickr.com/", "items": [ { "member1": "memeber value", "member2": "member value" }, { "member1": "memeber value", "member2": "member value" } ] } 

Así que las clases de Pojo serían

 public class MainPojo { private String title; private String description; private String link; private String generator; private String modified; private ArrayList<Items> items; // Getters setters } public class Items { private String member2; private String member1; // Getters setters } 

Nota: Esta es una solución similar para su JSON. Los miembros de Items.java se pueden cambiar si JSON tiene otras claves.


Actualización de Pojo como nuevo JSON

 public class Items { private String tags; private String author; private String title; private String description; private String link; private String author_id; private String published; private Media media; // Getters and Setters } public class Media { private String m; // Getters and Setters } 

Utilice el análisis fácil de Gson para sus modelos https://github.com/google/gson

Mis métodos auxiliares:

 public String toJson(Object object) { return gson.toJson(object); } public <T> T fromJson(String json, Class<T> classOfT) { return gson.fromJson(json, classOfT); } public <T> T fromJson(JsonElement jsonElement, Class<T> classOfT) { return gson.fromJson(jsonElement, classOfT); } 

El siguiente código ayudará a obtener el objeto json anidado y el array

por ejemplo: json

 { "similar_product":[ { ..... } ], "options":{ "Blouse Length":[ { "value_id":"696556", } 

primero necesitamos crear la clase del modelo, los nombres de los elementos de la clase del modelo son iguales en el artículo de json que podemos utilizar @SerializedName("for exact json name")

 public class Product { public Options options; public void setOptions(Options options) { this.options = options; } public Options getOptions() { return options; } // length... public class Options { @SerializedName("Blouse Length") private ArrayList<BlouseLength> blouseLengths; public void setBlouseLengths(ArrayList<BlouseLength> blouseLengths) { this.blouseLengths = blouseLengths; } public ArrayList<BlouseLength> getBlouseLengths() { return blouseLengths; } } public class BlouseLength { String value_id; public void setValue_id(String value_id) { this.value_id = value_id; } public String getValue_id() { return value_id; } } } 

crear interfaz para retrofit para obtener json artículo en url

 // don't need to put values of id in retrofit ex:: "/api-mobile_.php?method=getProductById&pid=" 

sólo pasar el parámetro url en la consulta automáticamente buscar la url

por ejemplo:

 public interface Retrofit_Api { @FormUrlEncoded @GET("/api-mobile_.php?method=getProductById") Call<Product> responseproduct(@Query("pid") String pid); } 

En tu clase principal

  String pid=editid.getText().toString(); final Retrofit adapter = new Retrofit.Builder() .baseUrl(Product_url) .addConverterFactory(GsonConverterFactory.create()) .build(); //Creating an object of our api interface Retrofit_Api api = adapter.create(Retrofit_Api.class); Call<Product> call = api.responseproduct(pid); call.enqueue(new Callback<Product>() { @Override public void onResponse(Call<Product> call, Response<Product> response) { ArrayList<Product.BlouseLength> p= new ArrayList(response.body().getOptions().getBlouseLengths()); Editadapter editadapter=new Editadapter(MainActivity.this,p); recyclerView.setAdapter(editadapter); } @Override public void onFailure(Call<Product> call, Throwable t) { Log.d("Error", t.getMessage()); } }); } 

¿Has probado volea? … lo prefiero sobre retrofit ahora que es un producto de google. Tengo ejemplo de trabajo y si u no importa que puedo demostrarle. http://www.androidhive.info/2014/09/android-json-parsing-using-volley/

Salam. Me olvidé de agregar @SerializedName y @Expose anotaciones para objetos de clase interna y después de agregar estas anotaciones problema resuelto. Me gusta esto:

JSON:

 {"Id": 1,} 

y miembro de la clase:

 @SerializedName("Id") @Expose private int id; 
  • ¿Cómo manejar los campos JSON opcionales en Retrofit para Android?
  • Cargar archivos en el servidor mediante retroadaptación
  • Retrofit 2.0 + RxJava + Error JSON cuerpo
  • Retrofit / Rxjava y servicios basados ​​en sesiones
  • ¿Cómo implementar correctamente el feed (similar a Facebook / Instagram) en Android?
  • Actualizaciones de Android Retrofit 2.0
  • Iniciar sesión a través de servicio web de descanso de android utilizando retroalimentación no funciona
  • Realizar N llamadas de api secuenciales usando RxJava y Retrofit
  • Análisis de GSON con Retrofit analizando la respuesta Flickr JSON
  • Obtenga un objeto json simple usando retrofit 2
  • Consulta GET con json - Retrofit 2.0
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.