RAW
RAW

Reputation: 7825

Can't parse JSON into a ListView

What I'm trying


I'd like to understand JSON on a deep level. For that I though I create a App for my Youtube-Channel. First I've created a JSON-File of my Channel on this site: GData Youtube and created this JSON-File: JSON of the Channel.

After that I started to create my Channel-App with this tutorial: JSON Tutorial, I changed it a bit that it "should" work with my Channel-JSON-File but it just dosn't work and I really don't get why, this is the Error-Message I allways get. 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

The thing is the Code of the JSONfunction.java works on the tutorial and here it dosn't so something must be wrong in the main.java but I don't get what's false.!!! :(

Question


What do I need to change in my Main.java to get my Code working. If you have a tutorial for the Problem I got, or a really good codesample i would be happy too. This is how the JSON-File from the Channel looks like:JSON-Structure The Code and the Error-Log you find down here:

Code


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

        });

    }

}

Error-Log

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

Thanks for you help in advance best regardes safari

Upvotes: 2

Views: 1298

Answers (1)

Programmer Bruce
Programmer Bruce

Reputation: 66943

To emphasize user370305's point (posted as a separate answer since multi-line code in comments isn't easy to read):

// 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);

Upvotes: 1

Related Questions