web-dev-qa-db-fra.com

Comment Retrofit 2.0 peut-il analyser un objet JSON imbriqué?

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:

  1. Écrire ma propre fabrique de convertisseurs JSON qui étend Converter.Factory .
  2. Renvoie la réponse brute dans un type String et l'analyse par moi-même. Mais il n’est pas facile d’obtenir la réponse brute de Retrofit 2.0 d’après mes recherches initiales. Retrofit 2.0 semble insister pour convertir la réponse en quelque chose avant de me le transmettre et Retrofit ne fournit pas sa propre 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.

24
hackjutsu

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
}
28
Pankaj Kumar

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



    }
6
lemuriyan

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

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;
0

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/

0
Goodlife