解析使用异步的Json网址 [英] Parsing Json url using async
问题描述
运行此code,当我得到异常。我想解析URL是JSON对象的数组:
包com.example.compsci_734t;进口java.io.BufferedReader中;
进口的java.io.InputStream;
进口java.io.InputStreamReader中;
进口的java.net.URL;进口org.apache.http.HttpEntity;
进口org.apache.http.Htt presponse;
进口org.apache.http.StatusLine;
进口org.apache.http.client.HttpClient;
进口org.apache.http.client.methods.HttpGet;
进口org.apache.http.impl.client.DefaultHttpClient;
进口org.json.JSONArray;
进口org.json.JSONException;
进口org.json.JSONObject;进口android.app.Activity;
进口android.os.AsyncTask;
进口android.os.Bundle;
进口android.util.Log;公共类UoaCompsciActivity延伸活动{ 私有静态字符串URL =http://redsox.tcs.auckland.ac.nz/734A/CSService.svc/courses;
// URL requestUrl =新的URL(网址);
JSONArray课程= NULL;
私有静态最后弦乐TAG_COURSES =课程; @覆盖
公共无效的onCreate(捆绑savedInstanceState){
super.onCreate(savedInstanceState);
的setContentView(R.layout.activity_uoa_compsci);
新MyTask()执行();
}
私有类MyTask扩展的AsyncTask< URL,太虚,JSONObject的> { @覆盖
受保护的JSONObject doInBackground(URL网址...){
loadJSON(URL);
返回null;
} 保护无效onPostExecute(JSON的JSONObject){ 尝试{
课程= json.getJSONArray(TAG_COURSES); //通过所有课程循环
的for(int i = 0; I< courses.length();我++){
JSONObject的C = courses.getJSONObject(I) //存储在变量中的每个JSON项目
串COURSE_ID = c.getString(courseField:);
字符串COURSE_NAME = c.getString(titleField:);
串course_semester = c.getString(semesterField:); Log.v( - ,课程:\\ n++ COURSE_ID ++ COURSE_NAME
++ course_semester);
} }赶上(JSONException E){
e.printStackTrace();
}
}
}
公众的JSONObject loadJSON(字符串URL){
//创建JSON解析器实例
JSONParser jParser =新JSONParser(); // URL从获取JSON字符串
JSONObject的JSON = jParser.getJSONFromUrl(URL); 返回JSON;
}}
另外这里是我的logcat:
05-13 20:29:05.118:I / dalvikvm(770):主题ID = 3:反应信号3
05-13 20:29:05.128:I / dalvikvm(770):写的堆栈跟踪到/data/anr/traces.txt
05-13 20:29:05.418:D / gralloc_goldfish(770):无仿真模拟GPU检测。
05-13 20:31:46.128:I / dalvikvm(842):主题ID = 3:反应信号3
05-13 20:31:46.218:I / dalvikvm(842):写的堆栈跟踪到/data/anr/traces.txt
05-13 20:31:46.408:D / gralloc_goldfish(842):无仿真模拟GPU检测。
05-13 22:06:17.298的:I / dalvikvm(918):主题ID = 3:反应以信号3
05-13 22:06:17.389:I / dalvikvm(918):写的堆栈跟踪到/data/anr/traces.txt
05-13 22:06:17.549:D / gralloc_goldfish(918):无仿真模拟GPU检测。
05-13 22:06:17.829:W / dalvikvm(918):主题ID = 11:螺纹未捕获的异常(组= 0x409c01f8)退出
05-13 22:06:17.839:E / AndroidRuntime(918):致命异常:AsyncTask的#1
05-13 22:06:17.839:E / AndroidRuntime(918):了java.lang.RuntimeException:执行doInBackground发生错误()
05-13 22:06:17.839:E / AndroidRuntime(918):在android.os.AsyncTask $ 3.done(AsyncTask.java:278)
05-13 22:06:17.839:E / AndroidRuntime(918):在java.util.concurrent.FutureTask中$ Sync.innerSetException(FutureTask.java:273)
05-13 22:06:17.839:E / AndroidRuntime(918):在java.util.concurrent.FutureTask.setException(FutureTask.java:124)
05-13 22:06:17.839:E / AndroidRuntime(918):在java.util.concurrent.FutureTask中$ Sync.innerRun(FutureTask.java:307)
05-13 22:06:17.839:E / AndroidRuntime(918):在java.util.concurrent.FutureTask.run(FutureTask.java:137)
05-13 22:06:17.839:E / AndroidRuntime(918):在android.os.AsyncTask $ SerialExecutor $ 1.run(AsyncTask.java:208)
05-13 22:06:17.839:E / AndroidRuntime(918):在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
05-13 22:06:17.839:E / AndroidRuntime(918):在java.util.concurrent.ThreadPoolExecutor中的$ Worker.run(ThreadPoolExecutor.java:569)
05-13 22:06:17.839:E / AndroidRuntime(918):在java.lang.Thread.run(Thread.java:856)
05-13 22:06:17.839:E / AndroidRuntime(918):java.lang.IllegalArgumentException异常:非法字符在计划指标0:产生的原因http://redsox.tcs.auckland.ac.nz/734A/CSService .SVC /课程
05-13 22:06:17.839:E / AndroidRuntime(918):在java.net.URI.create(URI.java:727)
05-13 22:06:17.839:E / AndroidRuntime(918):在org.apache.http.client.methods.HttpPost<&初始化GT;(HttpPost.java:79)
05-13 22:06:17.839:E / AndroidRuntime(918):在com.example.compsci_734t.JSONParser.getJSONFromUrl(JSONParser.java:36)
05-13 22:06:17.839:E / AndroidRuntime(918):在com.example.compsci_734t.UoaCompsciActivity.loadJSON(UoaCompsciActivity.java:78)
05-13 22:06:17.839:E / AndroidRuntime(918):在com.example.compsci_734t.UoaCompsciActivity $ MyTask.doInBackground(UoaCompsciActivity.java:42)
05-13 22:06:17.839:E / AndroidRuntime(918):在com.example.compsci_734t.UoaCompsciActivity $ MyTask.doInBackground(UoaCompsciActivity.java:1)
05-13 22:06:17.839:E / AndroidRuntime(918):在android.os.AsyncTask $ 2.call(AsyncTask.java:264)
05-13 22:06:17.839:E / AndroidRuntime(918):在java.util.concurrent.FutureTask中$ Sync.innerRun(FutureTask.java:305)
05-13 22:06:17.839:E / AndroidRuntime(918):... 5个
更新logcat的:
05-13 22:15:01.438:I / dalvikvm(968):主题ID = 3:反应信号3
05-13 22:15:01.598:I / dalvikvm(968):写的堆栈跟踪到/data/anr/traces.txt
05-13 22:15:01.718:D / gralloc_goldfish(968):无仿真模拟GPU检测。
05-13 22:15:02.288:E / JSON解析器(968):错误分析数据org.json.JSONException:值i»¿< java.lang.String类型的XML无法转换到的JSONObject
05-13 22:15:02.288:D / AndroidRuntime(968):关闭VM
05-13 22:15:02.288:W / dalvikvm(968):主题ID = 1:螺纹未捕获的异常(组= 0x409c01f8)退出
05-13 22:15:02.298:E / AndroidRuntime(968):致命异常:主要
05-13 22:15:02.298:E / AndroidRuntime(968):显示java.lang.NullPointerException
05-13 22:15:02.298:E / AndroidRuntime(968):在com.example.compsci_734t.UoaCompsciActivity $ MyTask.onPostExecute(UoaCompsciActivity.java:49)
05-13 22:15:02.298:E / AndroidRuntime(968):在com.example.compsci_734t.UoaCompsciActivity $ MyTask.onPostExecute(UoaCompsciActivity.java:1)
05-13 22:15:02.298:E / AndroidRuntime(968):在android.os.AsyncTask.finish(AsyncTask.java:602)
05-13 22:15:02.298:E / AndroidRuntime(968):在android.os.AsyncTask.access $ 600(AsyncTask.java:156)
05-13 22:15:02.298:E / AndroidRuntime(968):在android.os.AsyncTask $ InternalHandler.handleMessage(AsyncTask.java:615)
05-13 22:15:02.298:E / AndroidRuntime(968):在android.os.Handler.dispatchMessage(Handler.java:99)
05-13 22:15:02.298:E / AndroidRuntime(968):在android.os.Looper.loop(Looper.java:137)
05-13 22:15:02.298:E / AndroidRuntime(968):在android.app.ActivityThread.main(ActivityThread.java:4424)
05-13 22:15:02.298:E / AndroidRuntime(968):在java.lang.reflect.Method.invokeNative(本机方法)
05-13 22:15:02.298:E / AndroidRuntime(968):在java.lang.reflect.Method.invoke(Method.java:511)
05-13 22:15:02.298:E / AndroidRuntime(968):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:784)
05-13 22:15:02.298:E / AndroidRuntime(968):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
05-13 22:15:02.298:E / AndroidRuntime(968):在dalvik.system.NativeStart.main(本机方法)
05-13 22:15:02.889的:I / dalvikvm(968):主题ID = 3:反应以信号3
05-13 22:15:02.919:I / dalvikvm(968):写的堆栈跟踪到/data/anr/traces.txt
全logcat的:
05-13 22:15:01.438的:I / dalvikvm(968):主题ID = 3:反应以信号3
05-13 22:15:01.598:I / dalvikvm(968):写的堆栈跟踪到/data/anr/traces.txt
05-13 22:15:01.718:D / gralloc_goldfish(968):无仿真模拟GPU检测。
05-13 22:15:02.288:E / JSON解析器(968):错误分析数据org.json.JSONException:值
该错误是解释性本身:
java.lang.IllegalArgumentException异常:在计划非法字符
索引0
块引用>您需要删除您的网址开头空格字符:
私有静态字符串URL =http://redsox.tcs.auckland.ac.nz/734A/CSService.svc/courses;
更新:
您已经更新了你的问题后,现在的问题似乎是在这一行:
课程= json.getJSONArray(TAG_COURSES);
因为你没有初始化或设置的
课程价值
这就是为什么它让NullPointerException异常
错误。I get exceptions when running this code. I want to parse the url which is an array of json objects:
package com.example.compsci_734t; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.net.URL; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.StatusLine; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import android.app.Activity; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; public class UoaCompsciActivity extends Activity { private static String url = " http://redsox.tcs.auckland.ac.nz/734A/CSService.svc/courses"; //URL requestUrl = new URL(url); JSONArray courses = null; private static final String TAG_COURSES = "Courses"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_uoa_compsci); new MyTask().execute(); } private class MyTask extends AsyncTask<URL, Void, JSONObject> { @Override protected JSONObject doInBackground(URL... urls) { loadJSON(url); return null; } protected void onPostExecute(JSONObject json) { try { courses = json.getJSONArray(TAG_COURSES); // looping through all courses for (int i = 0; i < courses.length(); i++) { JSONObject c = courses.getJSONObject(i); // Storing each json item in variable String course_id = c.getString("courseField:"); String course_name = c.getString("titleField:"); String course_semester = c.getString("semesterField:"); Log.v("--", "Course: \n" + " " + course_id + " " + course_name + " " + course_semester); } } catch (JSONException e) { e.printStackTrace(); } } } public JSONObject loadJSON(String url) { // Creating JSON Parser instance JSONParser jParser = new JSONParser(); // getting JSON string from URL JSONObject json = jParser.getJSONFromUrl(url); return json; } }
Also here is my logcat:
05-13 20:29:05.118: I/dalvikvm(770): threadid=3: reacting to signal 3 05-13 20:29:05.128: I/dalvikvm(770): Wrote stack traces to '/data/anr/traces.txt' 05-13 20:29:05.418: D/gralloc_goldfish(770): Emulator without GPU emulation detected. 05-13 20:31:46.128: I/dalvikvm(842): threadid=3: reacting to signal 3 05-13 20:31:46.218: I/dalvikvm(842): Wrote stack traces to '/data/anr/traces.txt' 05-13 20:31:46.408: D/gralloc_goldfish(842): Emulator without GPU emulation detected. 05-13 22:06:17.298: I/dalvikvm(918): threadid=3: reacting to signal 3 05-13 22:06:17.389: I/dalvikvm(918): Wrote stack traces to '/data/anr/traces.txt' 05-13 22:06:17.549: D/gralloc_goldfish(918): Emulator without GPU emulation detected. 05-13 22:06:17.829: W/dalvikvm(918): threadid=11: thread exiting with uncaught exception (group=0x409c01f8) 05-13 22:06:17.839: E/AndroidRuntime(918): FATAL EXCEPTION: AsyncTask #1 05-13 22:06:17.839: E/AndroidRuntime(918): java.lang.RuntimeException: An error occured while executing doInBackground() 05-13 22:06:17.839: E/AndroidRuntime(918): at android.os.AsyncTask$3.done(AsyncTask.java:278) 05-13 22:06:17.839: E/AndroidRuntime(918): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 05-13 22:06:17.839: E/AndroidRuntime(918): at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 05-13 22:06:17.839: E/AndroidRuntime(918): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 05-13 22:06:17.839: E/AndroidRuntime(918): at java.util.concurrent.FutureTask.run(FutureTask.java:137) 05-13 22:06:17.839: E/AndroidRuntime(918): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208) 05-13 22:06:17.839: E/AndroidRuntime(918): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 05-13 22:06:17.839: E/AndroidRuntime(918): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 05-13 22:06:17.839: E/AndroidRuntime(918): at java.lang.Thread.run(Thread.java:856) 05-13 22:06:17.839: E/AndroidRuntime(918): Caused by: java.lang.IllegalArgumentException: Illegal character in scheme at index 0: http://redsox.tcs.auckland.ac.nz/734A/CSService.svc/courses 05-13 22:06:17.839: E/AndroidRuntime(918): at java.net.URI.create(URI.java:727) 05-13 22:06:17.839: E/AndroidRuntime(918): at org.apache.http.client.methods.HttpPost.<init>(HttpPost.java:79) 05-13 22:06:17.839: E/AndroidRuntime(918): at com.example.compsci_734t.JSONParser.getJSONFromUrl(JSONParser.java:36) 05-13 22:06:17.839: E/AndroidRuntime(918): at com.example.compsci_734t.UoaCompsciActivity.loadJSON(UoaCompsciActivity.java:78) 05-13 22:06:17.839: E/AndroidRuntime(918): at com.example.compsci_734t.UoaCompsciActivity$MyTask.doInBackground(UoaCompsciActivity.java:42) 05-13 22:06:17.839: E/AndroidRuntime(918): at com.example.compsci_734t.UoaCompsciActivity$MyTask.doInBackground(UoaCompsciActivity.java:1) 05-13 22:06:17.839: E/AndroidRuntime(918): at android.os.AsyncTask$2.call(AsyncTask.java:264) 05-13 22:06:17.839: E/AndroidRuntime(918): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 05-13 22:06:17.839: E/AndroidRuntime(918): ... 5 more
updated logcat:
05-13 22:15:01.438: I/dalvikvm(968): threadid=3: reacting to signal 3 05-13 22:15:01.598: I/dalvikvm(968): Wrote stack traces to '/data/anr/traces.txt' 05-13 22:15:01.718: D/gralloc_goldfish(968): Emulator without GPU emulation detected. 05-13 22:15:02.288: E/JSON Parser(968): Error parsing data org.json.JSONException: Value <?xml of type java.lang.String cannot be converted to JSONObject 05-13 22:15:02.288: D/AndroidRuntime(968): Shutting down VM 05-13 22:15:02.288: W/dalvikvm(968): threadid=1: thread exiting with uncaught exception (group=0x409c01f8) 05-13 22:15:02.298: E/AndroidRuntime(968): FATAL EXCEPTION: main 05-13 22:15:02.298: E/AndroidRuntime(968): java.lang.NullPointerException 05-13 22:15:02.298: E/AndroidRuntime(968): at com.example.compsci_734t.UoaCompsciActivity$MyTask.onPostExecute(UoaCompsciActivity.java:49) 05-13 22:15:02.298: E/AndroidRuntime(968): at com.example.compsci_734t.UoaCompsciActivity$MyTask.onPostExecute(UoaCompsciActivity.java:1) 05-13 22:15:02.298: E/AndroidRuntime(968): at android.os.AsyncTask.finish(AsyncTask.java:602) 05-13 22:15:02.298: E/AndroidRuntime(968): at android.os.AsyncTask.access$600(AsyncTask.java:156) 05-13 22:15:02.298: E/AndroidRuntime(968): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:615) 05-13 22:15:02.298: E/AndroidRuntime(968): at android.os.Handler.dispatchMessage(Handler.java:99) 05-13 22:15:02.298: E/AndroidRuntime(968): at android.os.Looper.loop(Looper.java:137) 05-13 22:15:02.298: E/AndroidRuntime(968): at android.app.ActivityThread.main(ActivityThread.java:4424) 05-13 22:15:02.298: E/AndroidRuntime(968): at java.lang.reflect.Method.invokeNative(Native Method) 05-13 22:15:02.298: E/AndroidRuntime(968): at java.lang.reflect.Method.invoke(Method.java:511) 05-13 22:15:02.298: E/AndroidRuntime(968): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 05-13 22:15:02.298: E/AndroidRuntime(968): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 05-13 22:15:02.298: E/AndroidRuntime(968): at dalvik.system.NativeStart.main(Native Method) 05-13 22:15:02.889: I/dalvikvm(968): threadid=3: reacting to signal 3 05-13 22:15:02.919: I/dalvikvm(968): Wrote stack traces to '/data/anr/traces.txt'
full logcat: 05-13 22:15:01.438: I/dalvikvm(968): threadid=3: reacting to signal 3 05-13 22:15:01.598: I/dalvikvm(968): Wrote stack traces to '/data/anr/traces.txt' 05-13 22:15:01.718: D/gralloc_goldfish(968): Emulator without GPU emulation detected. 05-13 22:15:02.288: E/JSON Parser(968): Error parsing data org.json.JSONException: Value 
解决方案The error is explanatory itself:
java.lang.IllegalArgumentException: Illegal character in scheme at index 0
You need to remove the beginning space character in your URL:
private static String url = "http://redsox.tcs.auckland.ac.nz/734A/CSService.svc/courses";
Update:
After you've updated your question, now the problem seems in this line:
courses = json.getJSONArray(TAG_COURSES);
because you haven't initialized or set the value of
courses
that's why its givingNullPointerException
error.这篇关于解析使用异步的Json网址的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!