Java 如何从JSON(LastFM API)中提取图像的url

Java 如何从JSON(LastFM API)中提取图像的url,java,android,json,Java,Android,Json,我是JSON的初学者 因此,我尝试从JSON回复中提取图像的url 下面是允许我获取数组的代码: // Instantiate the RequestQueue. RequestQueue queue = Volley.newRequestQueue(getActivity()); //String url ="http://www.google.com"; String url = "http://

我是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);
如何获取给定大小的图像的url


非常感谢您的建议。

正如Raghunandan提到的,您正在提取一个JSONObject,当您需要提取一个JSONArray时,您可以从该数组中提取一个JSONObject


尝试使用类似的库来简化此任务,或参考此小型JSON库。

解析JSON数组实际上非常简单:

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

希望对你有帮助

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

更新:这将只打印大小=中等的URL


你可以用谷歌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映射到java对象。注意:你可以随意从POJO中删除不需要的对象


您可以使用getter函数获取图像,以查找图像媒体的url,我是这样做的:

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

我想一定有更好的。。。但它确实起作用了

您的回复是jsonarray名称相册。所以这个jsono=新的JSONObject响应;不正确。这只是答案的摘录。。。这正是阵列部分。我已经编写了代码:jsonArray=jsono.getJSONObjectresults.getJSONObjectalbummatches.getJSONArrayalbum;答案中没有url,但是文本没有,但是哦,对不起,我理解错了你的问题,我正在解析上面的url,而不是上面由@Parag回答的图像url,应该可以解决你的问题。谢谢你,我通过你的双重迭代找到了所有的url。但是如何获得单个大小,例如中等大小?如果您想获得相应文本的大小,只需使用myInnerIterator.getString大小;但我不能再次迭代,因为myInnerIterator中没有数组,所以JSONArray arrayTwo=myInnerIterator.getJSONArray size;给我一个例外。。。感谢你们的耐心:谢谢你们,比我更好的解决方案我很高兴能帮上忙:Albums Albums=gson.fromJsonjsono.optStringalbum,Albums.class;返回空值??
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;
}
Gson gson = new Gson();

// Im assuming "response" as the above JSON object
Albums albums = gson.fromJson(response.optString("album"),Albums.class);
                            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();
                                }