Как получить и разобрать JSON-объект с помощью Volley

Я не смог найти подробный ответ на этот вопрос, или, по крайней мере, не тот, который я могу понять.

Я пытаюсь настроить Volley, чтобы вытащить JSON-объекты из iTunes. Затем я хочу проанализировать объекты, чтобы получить их URL-адреса изображений.

Так например, вот am iTunes JSON object URL

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

Итак, здесь я настроил свой код, чтобы получить этот объект (используя учебник, конечно)

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

последнее утверждение

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

предположительно, у меня теперь есть JSON-объект? Но как я могу получить доступ и проанализировать его?

3 ответов


С вашим Url-адресом вы можете использовать следующий пример кода:

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

класс 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;
}

внутри построения.файл gradle:

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

надеюсь, что это помогает!


просто вставьте этот url-адрес в свой браузер, вы можете увидеть весь объект json. Вы можете использовать веб-сайт JSON formatter для просмотра в хорошем формате.

посмотрите здесь, чтобы найти необходимые методы. http://developer.android.com/reference/org/json/JSONObject.html

ваш код не работает, потому что эти объекты не существуют на этом json.


использовать ДСЫН с простой POJO это. Вот это документация GSON

Предположим, у вас есть это:

 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...
}

вы можете использовать GSON для этого:

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

и теперь у вас есть объект, представляющий ответ! Обратите внимание, как я сделал имена полей объекта "песня" имеют те же имена, что и значения, о которых вы заботитесь (в этом случае появляется сеть и сайт-это то, что вы хотели). Gson выполняет работу сериализации объекта JSON в POJO, который вы смогите сразу получить доступ к значениям чисто, и легкий.

для преобразования обратно это так же просто, как:

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

просто добавьте в свою сборку.gradle via:

compile 'com.google.code.gson:gson:1.7.2'