web-dev-qa-db-fra.com

Comment obtenir et analyser un objet JSON avec Volley

Je n'ai pas été en mesure de trouver une réponse détaillée à cette question, ou du moins pas une que je puisse comprendre. 

J'essaie de configurer Volley pour extraire les objets JSON d'iTunes. Je veux ensuite analyser les objets, pour obtenir leurs URL d'image.

Ainsi, par exemple, voici l'URL de l'objet JSON iTunes.

String url = "https://iTunes.Apple.com/search?term=michael+jackson";

Donc ici j'ai configuré mon code pour obtenir cet objet (en utilisant un tutoriel bien sûr)

String url = "https://iTunes.Apple.com/search?term=michael+jackson";

JsonObjectRequest jsonRequest = new JsonObjectRequest
        (Request.Method.GET, url, null, new Downloader.Response.Listener // Cannot resolve symbol Listener
                <JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
                // the response is already constructed as a JSONObject!
                try {
                    response = response.getJSONObject("args");
                    String site = response.getString("site"),
                            network = response.getString("network");
                    System.out.println("Site: "+site+"\nNetwork: "+network);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        }, new Downloader.Response.ErrorListener // Cannot resolve symbol ErrorListener
                () {

            @Override
            public void onErrorResponse(VolleyError error) {
                error.printStackTrace();
            }
        });

Volley.newRequestQueue(this).add(jsonRequest);

La toute dernière déclaration est 

Volley.newRequestQueue(this).add(jsonRequest);

Vraisemblablement, j'ai maintenant l'objet JSON? Mais comment puis-je y accéder et l’analyser?

6
the_prole

Avec votre URL, vous pouvez utiliser l'exemple de code suivant:

        RequestQueue requestQueue = Volley.newRequestQueue(this);
        String url = "https://iTunes.Apple.com/search?term=michael+jackson";
        JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(url, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
                if (response != null) {
                    int resultCount = response.optInt("resultCount");
                    if (resultCount > 0) {
                        Gson gson = new Gson();
                        JSONArray jsonArray = response.optJSONArray("results");
                        if (jsonArray != null) {
                            SongInfo[] songs = gson.fromJson(jsonArray.toString(), SongInfo[].class);
                            if (songs != null && songs.length > 0) {
                                for (SongInfo song : songs) {
                                    Log.i("LOG", song.trackViewUrl);
                                }
                            }
                        }
                    }
                }
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.e("LOG", error.toString());
            }
        });
        requestQueue.add(jsonObjectRequest);

La classe SongInfo:

public class SongInfo {
    public String wrapperType;
    public String kind;
    public Integer artistId;
    public Integer collectionId;
    public Integer trackId;
    public String artistName;
    public String collectionName;
    public String trackName;
    public String collectionCensoredName;
    public String trackCensoredName;
    public String artistViewUrl;
    public String collectionViewUrl;
    public String trackViewUrl;
    public String previewUrl;
    public String artworkUrl30;
    public String artworkUrl60;
    public String artworkUrl100;
    public Float collectionPrice;
    public Float trackPrice;
    public String releaseDate;
    public String collectionExplicitness;
    public String trackExplicitness;
    public Integer discCount;
    public Integer discNumber;
    public Integer trackCount;
    public Integer trackNumber;
    public Integer trackTimeMillis;
    public String country;
    public String currency;
    public String primaryGenreName;
    public String radioStationUrl;
    public Boolean isStreamable;
}

Dans le fichier build.gradle:

compile 'com.mcxiaoke.volley:library:1.0.19'
compile 'com.google.code.gson:gson:2.5'

J'espère que cela t'aides!

11
BNK

Il suffit de coller cette URL sur votre navigateur, vous pouvez voir tout l’objet json. Vous pouvez utiliser un site Web json formateur pour voir dans un format de Nice.

Jetez un coup d'œil ici pour trouver les méthodes dont vous avez besoin. http://developer.Android.com/reference/org/json/JSONObject.html

Votre code ne fonctionne pas car ces objets n'existent pas sur ce JSON.

0
Tiago Ribeiro

Utilisez GSON avec de simples POJO. Voici la Documentation GSON

Supposons que vous ayez ceci:

 public class Song{
     private String site;
     private String network;

     public void setSite(String site){
         this.site = site;
     }
     public void setNetwork(String network{
         this.network = network;
     }

     //Add getters as well...
}

Vous pouvez utiliser GSON pour cela:

Song song = Gson.fromJson(response.getJSONObject("args"), Song.class);

Et maintenant vous avez un objet représentant la réponse! Remarquez comment j'ai fait en sorte que les noms de champs de l'objet "Song" aient les mêmes noms que les valeurs qui vous intéressent (dans ce cas, il semble que réseau et site correspondent à vos besoins). Gson sérialise un objet JSON en un POJO permettant d’accéder directement et facilement aux valeurs.

Pour reconvertir c'est aussi simple que:

JSONObject obj = new JSONObject(gson.toJson(song));

Ajoutez simplement à votre build.gradle via:

compile 'com.google.code.gson:gson:1.7.2'
0
Lucas Crawford