2012-03-04 12 views
0

私はJsonをListViewに解析しようとしていましたが、Android:ListviewのJsonを解析する

03-04 14:43:45.345: E/log_tag(16519): Error parsing data org.json.JSONException: No value for items 

何とかJsonオブジェクトから項目を取得できません。

ここに私のコードがあります。

getJSON.java

import java.io.BufferedReader; 
    import java.io.InputStream; 
    import java.io.InputStreamReader; 

    import org.apache.http.HttpEntity; 
    import org.apache.http.HttpResponse; 
    import org.apache.http.client.HttpClient; 
    import org.apache.http.client.methods.HttpPost; 
    import org.apache.http.impl.client.DefaultHttpClient; 
    import org.json.JSONException; 
    import org.json.JSONObject; 

    import android.util.Log; 

    public class getJSON { 

     public static JSONObject getJSONfromURL(String url){ 
      InputStream is = null; 
      String result = ""; 
      JSONObject jArray = null; 

      //http post 
      try{ 
        HttpClient httpclient = new DefaultHttpClient(); 
        HttpPost httppost = new HttpPost(url); 
        HttpResponse response = httpclient.execute(httppost); 
        HttpEntity entity = response.getEntity(); 
        is = entity.getContent(); 

      }catch(Exception e){ 
        Log.e("NO CONNECTION", "Error in http connection "+e.toString()); 
      } 

      //convert response to string 
      try{ 
        BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8); 
        StringBuilder sb = new StringBuilder(); 
        String line = null; 
        while ((line = reader.readLine()) != null) { 
          sb.append(line + "\n"); 
        } 
        is.close(); 
        result=sb.toString(); 
      }catch(Exception e){ 
        Log.e("CANT CONVERT DATA", "Error converting result "+e.toString()); 
      } 

      try{ 

       jArray = new JSONObject(result);    
      }catch(JSONException e){ 
        Log.e("CANT READ DATA", "Error parsing data "+e.toString()); 
      } 

      return jArray; 
     } 
} 

listview.java

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.listplaceholder); 
     ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>(); 

     //Get the data (see above) 
     JSONObject json = getJSON.getJSONfromURL("http://gdata.youtube.com/feeds/api/users/UKFDubstep/uploads?v=2&alt=jsonc"); 


       try{ 



        final JSONArray array = json.getJSONArray("items"); 

         //Loop the Array 
       for(int i=0;i < array.length();i++){       

        HashMap<String, String> map = new HashMap<String, String>(); 
        JSONObject e = array.getJSONObject(i); 

        map.put("id", String.valueOf(i)); 
        map.put("title", "" + e.getString("title")); 
        map.put("viewCount", "Views: " + e.getString("viewCount")); 
        mylist.add(map); 
      } 
       }catch(JSONException e)  { 
       Log.e("log_tag", "Error parsing data "+e.toString()); 
       } 

       ListAdapter adapter = new SimpleAdapter(this, mylist , R.layout.dubstep, 
         new String[] { "title", "viewCount" }, 
         new int[] { R.id.item_title, R.id.item_subtitle }); 

     setListAdapter(adapter); 

     final ListView lv = getListView(); 
     lv.setTextFilterEnabled(true); 
     lv.setOnItemClickListener(new OnItemClickListener() { 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      @SuppressWarnings("unchecked") 
      HashMap<String, String> o = (HashMap<String, String>) lv.getItemAtPosition(position); 
      Toast.makeText(dubstep.this, "ID '" + o.get("id") + "' was clicked.", Toast.LENGTH_SHORT).show(); 

      } 
     }); 

    } 

私はそれが間違っていた見当がつかない。

助けが必要ですか?おかげさまで

EDIT: JSON出力

03-04 15:30:29.955: I/json(19109): {"error":{"message":"Response contains no content type","errors":[{"internalReason":"Response contains no content type","domain":"GData","code":"missingContentType"}],"code":400},"apiVersion":"2.1"} 

編集JSONリンク;のhttp:?//gdata.youtube.com/feeds/api/users/UKFDubstep/uploads V = 2 & ALT = jsonc

+0

あなたも持っている生のJSON文字列を投稿できますか?あなたが持っているJSONは、あなたが期待したのと同じフォーマットではないようです。 – xandy

+0

そこにURLがあります。ネットワークスレッドをUIスレッドから外したいと思うと思います。あなたのJSONパッケージがどのように機能するのか分かりませんが、 "items"は "data"内にネストされています。ネストされた方法で参照する必要がありますか? "data.items"? – dldnh

答えて

1

JSONの結果を見て(あなたの例のURLを開くことによって)、「items」は別のJSONObjectの中にあることがわかります。これで唯一のあなたはそれを動作させるために行う必要があり、あなたがgetJSON.javaを必要といけない

JSONObject data = json.getJSONObject('data'); 
JSONArray array = data.getJSONArray('items'); 
+0

それから私はこれを得る。非アクティブなInputConnectionのgetExtractedTextとデータの値なし –

+0

あなたが取得した例外を正確に投稿できますか?あなたがしようとすることができるのは、単にLogCat json.toString()を印刷して、実際にすべてのデータが表示されていることを確認できるようにすることです。 – YuviDroid

+0

完了しましたが、どうやってそのようになりましたか –

0

:だから私はあなたがする必要があると考えてい

private static String URL = "http://gdata.youtube.com/feeds/api/users/UKFDubstep/uploads?v=2&alt=jsonc"; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.listplaceholder); 

    ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>(); 

     try{     
       HttpClient httpclient = new DefaultHttpClient(); 
       httpclient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1); 
       HttpGet request = new HttpGet(URL); 
       HttpResponse response = httpclient.execute(request); 
       HttpEntity resEntity = response.getEntity(); 
       String _response = EntityUtils.toString(resEntity); // content will be consume only once 
       Log.i(".......",_response); 
       JSONObject json = new JSONObject(_response); 
       JSONArray jarray = json.getJSONArray("items");      
        //Loop the Array 
       for(int i=0;i < array.length();i++){       

        HashMap<String, String> map = new HashMap<String, String>(); 
        JSONObject e = array.getJSONObject(i); 

        map.put("id", String.valueOf(i)); 
        map.put("title", "" + e.getString("title")); 
        map.put("viewCount", "Views: " + e.getString("viewCount")); 
        mylist.add(map); 
     } 
      }catch(JSONException e)  { 
      Log.e("log_tag", "Error parsing data "+e.toString()); 
      } 

      ListAdapter adapter = new SimpleAdapter(this, mylist , R.layout.dubstep, 
        new String[] { "title", "viewCount" }, 
        new int[] { R.id.item_title, R.id.item_subtitle }); 

    setListAdapter(adapter); 

    final ListView lv = getListView(); 
    lv.setTextFilterEnabled(true); 
    lv.setOnItemClickListener(new OnItemClickListener() { 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
     @SuppressWarnings("unchecked") 
     HashMap<String, String> o = (HashMap<String, String>) lv.getItemAtPosition(position); 
     Toast.makeText(dubstep.this, "ID '" + o.get("id") + "' was clicked.", Toast.LENGTH_SHORT).show(); 

     } 
    }); 

} 

しかし、あなたは今、それをすべきで、JSONデータをすべきであるパー​​スUIスレッドでは実行されません。 AsyncTaskを拡張してdoInBackgound()メソッドでそのジョブを実行する必要があるため、UIではなく別のスレッドで解析することができます... AsyncTask