recyclerview implementar example ejemplo body android json retrofit

android - implementar - ¿Cómo puede Retrofit 2.0 analizar el objeto JSON anidado?



retrofit post example (5)

¿Has probado la volea? ... lo prefiero a la modificación ahora que es un producto de Google. Tengo un ejemplo práctico y si no me importa, puedo mostrarle. http://www.androidhive.info/2014/09/android-json-parsing-using-volley/

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

Por ejemplo, here 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 . Noté que hay algunas publicaciones sobre el análisis de objetos JSON anidados a través de Retrofit 1.X, pero las últimas API de Retrofit 2.0 han cambiado mucho, lo cual es confuso al adaptarlas a las nuevas API.

Dos posibles soluciones vienen a mi mente:

  1. Escribe mi propia fábrica de convertidores JSON que amplía Converter.Factory .
  2. Devolver la respuesta en bruto en un tipo de cadena y analizarla por mí mismo. Pero no es fácil obtener la respuesta bruta de Retrofit 2.0 según mi investigación inicial. Retrofit 2.0 parece insistir en convertir la respuesta en algo antes de StringConverter y Retrofit no proporciona su propio StringConverter . (Podría estar equivocado ~)

Actualización: en realidad podemos obtener la respuesta en bruto configurando JSONElement como el pojo para la interfaz de la API HTTP y usar GSONConverter proporcionado por Retrofit como el convertidor.


Asumiendo que tu JSON completo se ve como

{ "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 para 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 }


El siguiente código ayudará a obtener la matriz y el objeto json anidados

por ejemplo: json

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

Primero necesitamos crear una clase modelo, los nombres de los elementos de la clase modelo son iguales en el elemento json, podemos usar @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 una interfaz para la actualización para obtener el elemento json en url

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

acaba de 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()); } }); }


Olvidé agregar las anotaciones @SerializedName y @Expose para los objetos de clase internos y, después de agregar estas anotaciones, el problema se resolvió. Me gusta esto:

JSON:

{"Id": 1,}

y miembro de la clase:

@SerializedName("Id") @Expose private int id;


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

Mis métodos de ayuda:

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); }