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:
- Escribe mi propia fábrica de convertidores JSON que amplía Converter.Factory .
- 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 propioStringConverter
. (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);
}