2017-05-31 16 views
0

私はJSONの初心者です。JSON(LastFM API)から画像のURLを抽出する方法

私は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の答えにこの部分の構造である:ANのURLを取得する方法

{ 

    "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" 
       } 
      ] 
     } 
    ] 
} 

所定のサイズの画像ですか?

ご協力いただきありがとうございます。

+0

あなたの応答はjsonarrayの名前のアルバムです。したがって、この 'jsono =新しいJSONObject(レスポンス);は正しくありません。 – Raghunandan

答えて

0

JSONはキー値表現に過ぎません。それをぶつかるのは難しいことではありません。あなたのコードは次のようなもの、

更新する必要があります:これは、あなたがこのためにグーグルGSONを使用することができますsize = medium

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")); 
     } 
    } 
+0

ありがとう、私はあなたのダブル反復ですべてのURLを見つける。しかし、どのように単一のサイズ、例えば媒体を得るか? – Aristide13

+0

それぞれの '#text'に対して' size'を取得したい場合は、 'myInnerIterator.getString(" size ")';を使用してください。 –

+0

しかし、myInnerIterratorに配列がないので、もう一度反復することはできません。JSONArray arrayTwo = myInnerIterator.getJSONArray( "size");私に例外を与えます...あなたの忍耐に感謝します:) – Aristide13

0

Raghunandanが述べたように、JSONObjectを抽出する必要があるときにJSONArrayを抽出し、その配列からJSONObjectを抽出できます。

GSONなどのライブラリを使用してこの作業を簡単にするか、この小さなJSONライブラリI wroteを参照してください。

+0

これは答えの抜粋だけです...正確には "配列"部分です。 jsonArray = jsono.getJSONObject( "results")。getJSONObject( "albummatches")。getJSONArray( "album");コード化しました。 – Aristide13

0

これは、JSON配列を解析するために、実際にはかなり簡単です:

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

はそれが役に立てば幸い!

+0

答えに「url」はありませんが、「#text」 – Aristide13

+0

url = "http://www.last.fm/music/Jumbo/DD+Y+Ponle+Play"を取得していませんか? – sumit

+0

いいえhttp://images.amazon.com/images/P/B00005LN6S.01._SCMZZZZZZZ_.jpg – Aristide13

1

を持っているURLのを印刷します。依存関係としてインポートする

最初にアルバムクラスを作成します。

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オブジェクトへのあなたのJSONをマッピングします

Gson gson = new Gson(); 

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

この下に、このコードを試してみてください(注:あなたが不要な削除することができますあなたが好きなようにPOJOのオブジェクト)

ゲッター関数を使用して画像を取得できます

+0

アルバムalbums = gson.fromJson(jsono.optString( "album")、Albums.class) ; nullを返しますか? – Aristide13

0

は、画像の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(); 
           } 

私ははるかに良いがなければならないと思います...しかし、それは仕事をしていません!

+0

私の答えをチェックし、コードを更新しました –

関連する問題