¿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:
- RxJava onCompleted y onTerminate en el hilo principal
- .debounce () de RxJava interfiriendo con los hilos de mis observables y manejo de errores
- Manejar errores en Retrofit 2 RX
- POST con Android Retrofit
- HTTPS no envía algunos encabezados de autenticación con Retrofit
{ "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:
- Escribir mi propia fábrica convertidor JSON que extiende Converter.Factory .
- 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:)
- EOFException en Retrofit al ejecutar peticiones PUT síncronas
- Manejo de listas con RxJava y Retrofit en android
- La fábrica del convertidor de retroadaptación no puede acceder a GsonConverterFactory
- Manera correcta de manejar ninguna red con Retrofit y RX-java
- Encadenamiento de llamadas de Retrofit con RxJava y devolución del objeto principal
- Uso de subscribeOn con Retrofit
- Cubriendo json array utilizando retrofit?
- ¿Cómo se pueden manejar múltiples solicitudes para llenar modelos con RXJava Observables?
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;
- Aplicación de notificación de Android
- ¿Qué sucede en Activity.finish () con AsyncTask todavía en ejecución en segundo plano?