【问题标题】:How to extract the url of an image from a JSON (LastFM API)如何从 JSON (LastFM API) 中提取图像的 url
【发布时间】:2017-06-01 08:17:40
【问题描述】:

我是使用 JSON 的初学者。

所以我尝试从 JSON 回复中提取图像的 url。

这是允许我获取数组的代码:

            // Instantiate the RequestQueue.
            RequestQueue queue = Volley.newRequestQueue(getActivity());
            //String url ="http://www.google.com";
            String url = "http://ws.audioscrobbler.com/2.0/?method=album.search&album="+albumName+"&api_key=c51f8eb36bad&format=json";


            // Request a string response from the provided URL.
            StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
                    new Response.Listener<String>() {
                        @Override
                        public void onResponse(String response) {
                            // Display the first 500 characters of the response string.
                            //mTextView.setText("Response is: "+ response.substring(0,500));
                            Log.i("RESPONSE","Response is: "+ response);

                            JSONObject jsono = new JSONObject();
                            try {
                                jsono = new JSONObject(response);
                                //String url = jsono.getString("results");


                                //Log.i("RESPONSE",url);
                            } catch (JSONException e) {
                                e.printStackTrace();
                                Log.d ("RESPONSE",e.getMessage());
                            }
                            JSONArray jsonArray = new JSONArray();
                            try {
                                jsonArray = jsono.getJSONObject("results").getJSONObject("albummatches").getJSONArray("album");
                            } catch (JSONException e) {
                                e.printStackTrace();
                                Log.d ("RESPONSE",e.getMessage());
                            }
                            for (int i = 0; i < jsonArray.length(); i++) {
                                JSONObject object = new JSONObject();
                                try {
                                    object = jsonArray.getJSONObject(i);
                                    Log.i("RESPONSE",object.getString("image"));

                                } catch (JSONException e) {
                                    e.printStackTrace();
                                }

                            }
                        }
                    }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Log.i("RESPONSE","That didn't work!");
                }
            });
            queue.add(stringRequest);

这是 JSON 答案中这部分的结构:

    {

    "album": [
        {
            "name": "DD Y Ponle Play",
            "artist": "Jumbo",
            "id": "2528039",
            "url": "http://www.last.fm/music/Jumbo/DD+Y+Ponle+Play",
            "image": [
                {
                    "#text": "http://images.amazon.com/images/P/B00005LN6S.01._SCMZZZZZZZ_.jpg",
                    "size": "small"
                },
                {
                    "#text": "http://images.amazon.com/images/P/B00005LN6S.01._SCMZZZZZZZ_.jpg",
                    "size": "medium"
                },
                {
                    "#text": "http://images.amazon.com/images/P/B00005LN6S.01._SCMZZZZZZZ_.jpg",
                    "size": "large"
                },
                {
                    "#text": "http://images.amazon.com/images/P/B00005LN6S.01._SCMZZZZZZZ_.jpg",
                    "size": "extralarge"
                }
            ]
        }
    ]
}

如何获取给定尺寸的图片的url?

非常感谢您的建议。

【问题讨论】:

  • 您的回复是 jsonarray 名称专辑。所以这个jsono = new JSONObject(response);是不对的。

标签: java android json


【解决方案1】:

您可以为此使用谷歌 GSON。将其作为依赖项导入

首先创建一个相册类。

public class Albums {

private List<Album> album;

public List<Album> getAlbum() {
    return album;
}

public class Album{
    private String name;
    private String artist;
    private String id;
    private String url;

    public String getName() {
        return name;
    }

    public String getArtist() {
        return artist;
    }

    public String getId() {
        return id;
    }

    public String getUrl() {
        return url;
    }

    public List<Image> getImage() {
        return image;
    }

    public class Image {
        @SerializedName("#text")
        private String text;
        private String size;

        public String getText() {
            return text;
        }

        public String getSize() {
            return size;
        }
    }

    private List<Image> image;
}

}

现在在您获得上述 JSON 对象的代码中尝试以下代码

Gson gson = new Gson();

// Im assuming "response" as the above JSON object
Albums albums = gson.fromJson(response.optString("album"),Albums.class);

这会将您的 json 映射到 java 对象。(注意:您可以根据需要从 POJO 中删除不需要的对象)

您可以使用 getter 函数获取图像

【讨论】:

  • 专辑专辑 = gson.fromJson(jsono.optString("album"),Albums.class);返回 null ??
【解决方案2】:

JSON 只不过是一种键值表示。掌握它并不难。你的代码应该是这样的,

更新:这将只打印具有 size = medium 的 URL

    String response = "{\"album\":[{\"name\":\"DD Y Ponle Play\",\"artist\":\"Jumbo\",\"id\":\"2528039\",\"url\":\"http://www.last.fm/music/Jumbo/DD+Y+Ponle+Play\",\"image\":[{\"#text\":\"http://images.amazon.com/images/P/B00005LN6S.01._SCMZZZZZZZ_.jpg\",\"size\":\"small\"},{\"#text\":\"http://images.amazon.com/images/P/B00005LN6S.01._SCMZZZZZZZ_.jpg\",\"size\":\"medium\"},{\"#text\":\"http://images.amazon.com/images/P/B00005LN6S.01._SCMZZZZZZZ_.jpg\",\"size\":\"large\"},{\"#text\":\"http://images.amazon.com/images/P/B00005LN6S.01._SCMZZZZZZZ_.jpg\",\"size\":\"extralarge\"}]}]}";

    JSONObject myObject = new JSONObject(response);
    JSONArray myArray = myObject.getJSONArray( "album" );

    for(int i=0; i<myArray.length(); i++)
    {
        JSONObject myIterator = myArray.getJSONObject( i );
        JSONArray arrayOne = myIterator.getJSONArray( "image" );

        for(int j=0; j<arrayOne.length(); j++)
        {
            JSONObject myInnerIterator = arrayOne.getJSONObject( j );               
            if(myInnerIterator.has( "size" ))//check if 'size' key is present
                if(myInnerIterator.getString( "size" ).equalsIgnoreCase( "medium" ))
                    System.out.println( myInnerIterator.getString( "#text" ) );
        }
    }

【讨论】:

  • 谢谢你,我找到了你的双重迭代的所有网址。但是如何获得单一尺寸,例如中号?
  • 如果您想为各自的#text 获取size,只需使用myInnerIterator.getString( "size" );
  • 但我无法再次迭代,因为 myInnerIterrator 中没有数组所以 JSONArray arrayTwo = myInnerIterator.getJSONArray ("size");给我一个例外...谢谢你的耐心:)
  • 谢谢你,比我更好的解决方案
  • 很高兴我能帮上忙 :)
【解决方案3】:

正如 Raghunandan 所说,您正在提取 JSONObject,当您需要提取 JSONArray,然后从该数组中提取 JSONObject。

尝试使用 GSON 之类的库来简化此任务,或参考这个小型 JSON 库 I wrote

【讨论】:

  • 这只是答案的摘录......它正是“数组”部分。我已经编码:jsonArray = jsono.getJSONObject("results").getJSONObject("albummatches").getJSONArray("album");
【解决方案4】:

解析 JSON 数组其实很简单:

JSONArray jsonarray = new JSONArray("album");
for (int i = 0; i < jsonarray.length(); i++) {
    JSONObject jsonobject = jsonarray.getJSONObject(i);
    String url = jsonobject.getString("url");
}

希望对你有帮助!!!

【讨论】:

【解决方案5】:

为了找到图片“中等”的网址,我这样做了:

                            ArrayList<String> listUrl = new ArrayList<String>();
                            for(int i=0; i<jsonArray.length(); i++)
                            {
                                JSONObject myIterator = null;
                                try {
                                    myIterator = jsonArray.getJSONObject( i );
                                    JSONArray arrayOne = myIterator.getJSONArray( "image" );

                                    for(int j=0; j<arrayOne.length(); j++)
                                    {
                                        JSONObject myInnerIterator = arrayOne.getJSONObject( j );
                                        String s = myInnerIterator.getString( "size" )+myInnerIterator.getString("#text");
                                        if (s.contains("medium") && s.contains("https")){
                                            listUrl.add (s.replace("medium",""));
                                            Log.i("RESPONSE",s.replace("medium",""));
                                        }

                                    }
                                } catch (JSONException e) {
                                    e.printStackTrace();
                                }

我认为肯定有更好的......但它确实有效!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-01
    • 2016-07-21
    • 2021-12-04
    相关资源
    最近更新 更多