无法将 JSON 解析为 ListView
我正在尝试
我想深入了解 JSON。为此,我为我的 Youtube 频道创建了一个应用程序。首先,我在此网站上创建了我的频道的 JSON 文件:GData Youtube 和创建了此 JSON 文件:频道的 JSON< /a>.
之后,我开始使用本教程创建我的频道应用程序: JSON 教程,我对其进行了一些更改,它“应该”与我的 Channel-JSON-File 一起使用,但它就是不起作用,我真的不明白为什么,这是我总是出现的错误消息 得到。 11-22 08:35:37.932: E/CANT READ DATA(15923): 解析数据时出错 org.json.JSONException: java.lang.String 类型的值响应无法转换为 JSONObject
是 JSONfunction.java 的代码适用于教程,但这里不是,所以 main.java 中一定有问题,但我不明白什么是错误的。!!! :(
问题
我需要在 Main.java 中更改什么才能使我的代码正常工作。如果您有针对我遇到的问题的教程,或者非常好的代码示例,我也会很高兴。 频道中的 JSON 文件如下所示: JSON-结构 您可以在此处找到代码和错误日志:
代码
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
感谢您提前提供帮助 最好的问候 游猎
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
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
为了强调 user370305 的观点(作为单独的答案发布,因为注释中的多行代码不容易阅读):
To emphasize user370305's point (posted as a separate answer since multi-line code in comments isn't easy to read):