2011-11-22 35 views
2

我試圖無法解析JSON成一個ListView


我想了解JSON在一個深層次的。爲此,我儘管爲Youtube頻道創建了一個應用程序。首先,我在此網站上創建了我的頻道的JSON文件:GData Youtube並創建了此JSON文件:JSON of the Channel

之後,我開始創建我的頻道應用程序與本教程:JSON Tutorial,我改變了它「應該」與我的頻道JSON文件,但它只是沒有工作,我真的不'噸得到原因,這是我總是得到的錯誤消息。 11-22 08:35:37.932: E/CANT READ DATA(15923): Error parsing data org.json.JSONException: Value Response of type java.lang.String cannot be converted to JSONObject

的東西是JSONfunction.java的代碼工作的教程,並在這裏不到風度所以一定出事的main.java,但我不明白什麼是假的。! :(

問題


什麼我需要在我的Main.java改變讓我的代碼工作。如果你對我的問題,還是一個非常好的codesample我的教程。就高興得 這是從通道的JSON-文件的樣子:JSON-Structure 代碼和錯誤日誌你發現到這裏:

代碼


JSONfunction.java

package de.stepforward; 

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

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

import android.util.Log; 

public class JSONfunction { 

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

ShowChannel.java

package de.stepforward; 

import java.util.ArrayList; 
import java.util.HashMap; 

import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

import android.app.ListActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.ListAdapter; 
import android.widget.ListView; 
import android.widget.SimpleAdapter; 
import android.widget.Toast; 
import android.widget.AdapterView.OnItemClickListener; 


public class ShowChannel extends ListActivity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

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

     JSONObject json = JSONfunction.getJSONfromURL("http://gdata.youtube.com/feeds/mobile/users/TheStepForward/uploads?alt=json&format=1"); 

     try{ 
     JSONObject feed = json.getJSONObject("feed"); 
     JSONArray entry = feed.getJSONArray("entry"); 

     for(int i=0;i<entry.length();i++){      
      HashMap<String, String> map = new HashMap<String, String>();  
      JSONObject e = entry.getJSONObject(i); 

      map.put("title", e.getString("title.$t")); 
      map.put("description", e.getString("content.$t")); 
      map.put("link", e.getString("media$player")); 
      map.put("thumbnail", e.getString("media$thumbnail.url")); 
      mylist.add(map); 

     } 



     }catch(JSONException e)  { 
     Log.e("log_tag", "Error parsing data "+e.toString()); 
     } 

     //Liste füllen 
     ListAdapter adapter = new SimpleAdapter(this, mylist , R.layout.listlayout, 
       new String[] {"thumbnail", "title", "description", "link" }, 
       new int[] { R.id.img_video, R.id.txt_title, R.id.txt_subtitle }); 

     setListAdapter(adapter); 

     //OnItemClickListner für Hyperlinks 
     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(ShowChannel.this, "Link '" + o.get("link") + "' was clicked.", Toast.LENGTH_SHORT).show(); 
      } 

     }); 

    } 

} 

錯誤日誌

11-22 08:35:37.932: E/CANT READ DATA(15923): Error parsing data org.json.JSONException: Value Response of type java.lang.String cannot be converted to JSONObject 
11-22 08:35:37.932: D/AndroidRuntime(15923): Shutting down VM 
11-22 08:35:37.932: W/dalvikvm(15923): threadid=1: thread exiting with uncaught exception (group=0x4001d5a0) 
11-22 08:35:38.032: E/AndroidRuntime(15923): FATAL EXCEPTION: main 
11-22 08:35:38.032: E/AndroidRuntime(15923): java.lang.RuntimeException: Unable to start activity ComponentInfo{de.stepforward/de.stepforward.ShowChannel}: java.lang.NullPointerException 
11-22 08:35:38.032: E/AndroidRuntime(15923): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1816) 
11-22 08:35:38.032: E/AndroidRuntime(15923): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1837) 
11-22 08:35:38.032: E/AndroidRuntime(15923): at android.app.ActivityThread.access$1500(ActivityThread.java:132) 
11-22 08:35:38.032: E/AndroidRuntime(15923): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1033) 
11-22 08:35:38.032: E/AndroidRuntime(15923): at android.os.Handler.dispatchMessage(Handler.java:99) 
11-22 08:35:38.032: E/AndroidRuntime(15923): at android.os.Looper.loop(Looper.java:143) 
11-22 08:35:38.032: E/AndroidRuntime(15923): at android.app.ActivityThread.main(ActivityThread.java:4196) 
11-22 08:35:38.032: E/AndroidRuntime(15923): at java.lang.reflect.Method.invokeNative(Native Method) 
11-22 08:35:38.032: E/AndroidRuntime(15923): at java.lang.reflect.Method.invoke(Method.java:507) 
11-22 08:35:38.032: E/AndroidRuntime(15923): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
11-22 08:35:38.032: E/AndroidRuntime(15923): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
11-22 08:35:38.032: E/AndroidRuntime(15923): at dalvik.system.NativeStart.main(Native Method) 
11-22 08:35:38.032: E/AndroidRuntime(15923): Caused by: java.lang.NullPointerException 
11-22 08:35:38.032: E/AndroidRuntime(15923): at de.stepforward.ShowChannel.onCreate(ShowChannel.java:36) 
11-22 08:35:38.032: E/AndroidRuntime(15923): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1093) 
11-22 08:35:38.032: E/AndroidRuntime(15923): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1780) 
11-22 08:35:38.032: E/AndroidRuntime(15923): ... 11 more 

感謝您提前幫助 最好regardes 野生動物園

+0

看我修改的答案。 – user370305

回答

1

爲了強調user370305的點(貼作爲一個單獨的答案,因爲在註釋多行代碼是不容易閱讀):

// No good. 
String notJsonObject = "This is not a JSON object."; 
JSONObject jsonObject = new JSONObject(notJsonObject); 

// Good. 
String validJsonObject = "{\"foo\":\"bar\"}"; 
JSONObject jsonObject = new JSONObject(validJsonObject);