Notre équipe a décidé d'utiliser Retrofit 2.0 et je suis en train de faire des recherches initiales sur cette bibliothèque. Comme indiqué dans le titre, je souhaite analyser certains objets JSON imbriqués via Retrofit 2.0 dans notre application Android.
Par exemple, ici est un objet JSON imbriqué au format:
{
"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": ...
},
{...},
...
]
}
Je suis intéressé par les objets JSON dans le tableau items
. Je remarque qu'il y a certains messages à propos de l'analyse des objets JSON imbriqués via Retrofit 1.X, mais les dernières API de Retrofit 2.0 ont beaucoup changé, ce qui crée de la confusion lors de leur adaptation aux nouvelles API.
Deux solutions possibles me viennent à l’esprit:
StringConverter
. (Je peux me tromper ~)Update: Nous pouvons obtenir la réponse brute en définissant JSONElement
en tant que pojo pour l'interface API HTTP et en utilisant GSONConverter fourni par Retrofit en tant que convertisseur.
En supposant que votre JSON complet ressemble à
{
"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"
}
]
}
Donc, les cours de Pojo seraient
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
}
Remarque: Ceci est une solution similaire pour votre JSON. Les membres de Items.Java peuvent être modifiés si JSON a d'autres clés.
Mise à jour pour Pojo en tant que nouveau 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
}
Le code suivant aidera à obtenir un objet et un tableau JSON imbriqués
par exemple: json
{
"similar_product":[
{ .....
}
],
"options":{
"Blouse Length":[
{ "value_id":"696556",
}
nous devons d’abord créer la classe de modèle. Les noms des éléments de la classe de modèle sont identiques dans l’élément json que nous pouvons utiliser @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;
}
}
}
créer une interface pour la modernisation afin d'obtenir un élément JSON dans l'URL
// don't need to put values of id in retrofit
ex:: "/api-mobile_.php?method=getProductById&pid="
il suffit de passer le paramètre url dans la requête pour récupérer automatiquement l'URL
par exemple:
public interface Retrofit_Api {
@FormUrlEncoded
@GET("/api-mobile_.php?method=getProductById")
Call<Product> responseproduct(@Query("pid") String pid);
}
Dans ton cours 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());
}
});
}
Utilisez l'analyse Gson easy pour vos modèles https://github.com/google/gson
Mes méthodes d'assistance:
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);
}
J'ai oublié d'ajouter les annotations @SerializedName
et @Expose
pour les objets de classe internes et après avoir ajouté le problème résolu avec ces annotations Comme ça:
JSON:
{"Id": 1,}
et membre du groupe:
@SerializedName("Id")
@Expose
private int id;
avez-vous essayé la volée? ... je le préfère à la rénovation, c’est maintenant un produit google. J’ai un exemple de travail et si cela ne vous dérange pas, je peux vous le montrer . http://www.androidhive.info/2014/09/Android- json-parsing-using-volley/