[英]Parsing JSON from Website
所以我為Android編寫了一個Java類來從網站上獲取JSON並解析它:
public class Communicator {
public String executeHttpGet(String URL) throws Exception
{
BufferedReader in = null;
try
{
HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet();
request.setURI(new URI(URL));
HttpResponse response = client.execute(request);
InputStream ips = response.getEntity().getContent();
BufferedReader buf = new BufferedReader(new InputStreamReader(ips,"UTF-8"));
StringBuilder sb = new StringBuilder();
String s;
while(true )
{
s = buf.readLine();
if(s==null || s.length()==0)
break;
sb.append(s);
}
buf.close();
ips.close();
return sb.toString();
}
finally
{
if (in != null)
{
try
{
in.close();
}
catch (IOException e)
{
Log.d("Exceptions !", e.toString());
}
}
}
}
}
所以這是我嘗試訪問的網站,這里是示例輸出:
http://www.railpnrapi.com/6520652825
{“tnum”:“15694”,“tname”:“BARAK VALLEY EX”,“tdate”:“25-7-2013”,“from”:“SCL”,“to”:“LMG”,“class” : “SL”, “繪制”:真 “numofpax”:1, “PAX”:[{ “教練”: “S1”, “泊位”: “8”, “配額”: “GN”, “狀態” : “CNF”}]}
以下是讀取JSON的INCOMPLETE代碼:
String page = new Communicator().executeHttpGet(url);
System.out.println(page)
JSONObject jsonObj = new JSONObject(page);
String id = jsonObj.getString("tname");
TextView t1 = (TextView)findViewById(R.id.textView1);
t1.setText(id);
我試圖將一小部分JSON輸出到TextView但這不起作用。 這是否意味着我必須事先完全解析它?
LogCat也顯示了這個錯誤:
07-02 06:18:08.889: W/System.err(831): android.os.NetworkOnMainThreadException
07-02 06:18:08.899: W/System.err(831): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117)
07-02 06:18:08.899: W/System.err(831): at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
07-02 06:18:08.899: W/System.err(831): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
07-02 06:18:08.899: W/System.err(831): at java.net.InetAddress.getAllByName(InetAddress.java:214)
07-02 06:18:08.899: W/System.err(831): at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137)
07-02 06:18:08.899: W/System.err(831): at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
07-02 06:18:08.899: W/System.err(831): at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
07-02 06:18:08.899: W/System.err(831): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
07-02 06:18:08.909: W/System.err(831): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
07-02 06:18:08.909: W/System.err(831): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
07-02 06:18:08.909: W/System.err(831): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
07-02 06:18:08.909: W/System.err(831): at com.example.in.ddas.indianrailpnr.Communicator.executeHttpGet(Communicator.java:27)
07-02 06:18:08.909: W/System.err(831): at com.example.in.ddas.indianrailpnr.PNRActivity$1.onTouch(PNRActivity.java:74)
07-02 06:18:08.919: W/System.err(831): at android.view.View.dispatchTouchEvent(View.java:7241)
07-02 06:18:08.919: W/System.err(831): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174)
07-02 06:18:08.919: W/System.err(831): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
07-02 06:18:08.919: W/System.err(831): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174)
07-02 06:18:08.919: W/System.err(831): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
07-02 06:18:08.919: W/System.err(831): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174)
07-02 06:18:08.929: W/System.err(831): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
07-02 06:18:08.929: W/System.err(831): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174)
07-02 06:18:08.929: W/System.err(831): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
07-02 06:18:08.929: W/System.err(831): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174)
07-02 06:18:08.929: W/System.err(831): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
07-02 06:18:08.939: W/System.err(831): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1953)
07-02 06:18:08.939: W/System.err(831): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1405)
07-02 06:18:08.939: W/System.err(831): at android.app.Activity.dispatchTouchEvent(Activity.java:2410)
07-02 06:18:08.939: W/System.err(831): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1901)
07-02 06:18:08.939: W/System.err(831): at android.view.View.dispatchPointerEvent(View.java:7426)
07-02 06:18:08.949: W/System.err(831): at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:3220)
07-02 06:18:08.949: W/System.err(831): at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:3165)
07-02 06:18:08.949: W/System.err(831): at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:4292)
07-02 06:18:08.949: W/System.err(831): at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:4271)
07-02 06:18:08.949: W/System.err(831): at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:4363)
07-02 06:18:08.959: W/System.err(831): at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:179)
07-02 06:18:08.959: W/System.err(831): at android.os.MessageQueue.nativePollOnce(Native Method)
07-02 06:18:08.959: W/System.err(831): at android.os.MessageQueue.next(MessageQueue.java:125)
07-02 06:18:08.959: W/System.err(831): at android.os.Looper.loop(Looper.java:124)
07-02 06:18:08.969: W/System.err(831): at android.app.ActivityThread.main(ActivityThread.java:5041)
07-02 06:18:08.969: W/System.err(831): at java.lang.reflect.Method.invokeNative(Native Method)
07-02 06:18:08.969: W/System.err(831): at java.lang.reflect.Method.invoke(Method.java:511)
07-02 06:18:08.969: W/System.err(831): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
07-02 06:18:08.969: W/System.err(831): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
07-02 06:18:08.969: W/System.err(831): at dalvik.system.NativeStart.main(Native Method)
那么如何將我的應用程序連接到互聯網(我已經設置了權限,但它仍然不起作用)! 任何幫助贊賞!
您應該使用Asynctask
來執行與網絡相關的操作。
or
創建一個線程並在線程內運行與網絡相關的操作。
您正在嘗試在ui線程上執行與nework相關的操作。 哪個不可能發布HoneyComb。
http://developer.android.com/reference/android/os/NetworkOnMainThreadException.html
調用asynctask
new TheTask().execute("myurl"); // invoke on ui thread.
的AsyncTask
http://developer.android.com/reference/android/os/AsyncTask.html
class TheTask extends AsyncTask<String,Void,Void>
{
@Override
protected String doInBackground(String... params) {
//params[0] is the url
// TODO Auto-generated method stub
// your network related operarion
String result = executeHttpGet(params[0]);
return result;
}
@Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
if(result!=null)
{
// parse json string
}
}
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
}
}
你應該在主線程之外的另一個線程上做網絡事情。 為此使用ASyncTask。
AsyncTask的一個例子: http ://subinsebastien.tumblr.com/post/10319834334/simple-asynctask-example-in-android
NetworkOnMainThreadException它意味着你不能把網絡進程放在主線程上使用異步任務而不是http://developer.android.com/reference/android/os/AsyncTask.html
Raghunandan已經解釋了你所面臨的問題......
為什么我們不必使用MainThread(也稱為UI Thread)來進行網絡相關操作?
Ans- 1. UI Thread還有其他任務,例如渲染用戶界面等.2。而不是使用已經超載其重要操作系統相關任務的UI線程。
因此,最好使用Asynctask
來處理與網絡相關的任務,這是處理諸如Java
的Thread類之類的任務的其他線程。
以下鏈接是開源庫,它雖然很小但很先進但對解析JSON更有幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.