2016-02-15 48 views
0

我正在學習使用JSON解析來自URL的數據。 在下面的代碼中,我是URLConnection類對象以從URL獲取數據。無法使用JSON獲取解析數據

該代碼不顯示任何錯誤,但在執行時會產生空白屏幕。 我無法理解爲什麼會發生。

這是代碼。

package com.example.asad.parse; 

import android.os.AsyncTask; 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.util.Log; 
import android.widget.TextView; 

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

import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.net.URL; 
import java.net.URLConnection; 

public class MainActivity extends AppCompatActivity { 
    TextView tv; 
    int count=0; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Log.d("asd", "calling call"); 

     new GetJson().execute("http://api.androidhive.info/json/movies.json"); 
//  try{ 
// 
//    call(); 
//   }catch(Exception e) { 
// 
//  } 

    } 
    public class GetJson extends AsyncTask<String, Void, Void> 
    { 
     @Override 
     protected Void doInBackground(String... params) { 
      Log.d("asd", params[0]); 
//   Log.d("asd","outside try"); 
      StringBuffer sb=new StringBuffer(); 
      URL url= null; 
      try { 
       Log.d("asd","inside call"); 
       url = new URL(params[0]); 

       URLConnection tc = url.openConnection(); 
       BufferedReader br = new BufferedReader(new InputStreamReader(
         tc.getInputStream())); 

       Log.d("asd","above while."); 
       String line; 
       while ((line = br.readLine()) != null) { 

        Log.d("asd","inside while."); 
        JSONArray ja = new JSONArray(line); 
        for (int i = 0; i < ja.length(); i++) { 
         JSONObject jo = (JSONObject) ja.get(i); 
         Log.d("asd",jo.toString()); 
        } 
       } 
// 
//   tv=(TextView)findViewById(R.id.textView); 
//   tv.setText(sb); 
       Log.d("asd",sb.toString()); 

      } catch (Exception e) { 
       e.printStackTrace(); 
       Log.d("asd", "I am in catch"); 

      } 
      return null; 
     } 
    } 
} 
+0

您是否嘗試在瀏覽器中運行url以查看json是否正確顯示? –

+0

什麼是Log.d(「asd」,params [0])和Log.d(「asd」,jo.toString())輸出? – Kuvalya

+0

params [0]打印我指定的URL,因爲代碼無法進入while循環,這就是jo.toString()不打印任何內容的原因。 – a874

回答

1

建議JSON使用StringBuilder。 可能有幾件事情你的代碼錯誤:由線

  1. 權限在mainfest.xml

    <uses-permission android:name="android.permission.INTERNET"/> 
    
  2. 讀書線不是JSON完美的解決方案。

使用靜態方法來從URL

public static String getData(String uri) { 
    BufferedReader reader = null; 
    try { 
     URL url = new URL(uri); 
     HttpURLConnection con = (HttpURLConnection) url.openConnection(); 

     StringBuilder sb = new StringBuilder(); 
     reader = new BufferedReader(new InputStreamReader(con.getInputStream())); 
     String line; 

     while ((line = reader.readLine()) != null) { 
      sb.append((line + "\n")); 
     } 

     return sb.toString(); 

    } catch (MalformedURLException e) { 
     e.printStackTrace(); 
     return null; 

    } catch (IOException e) { 
     e.printStackTrace(); 
     return null; 

    } finally { 
     if (reader != null) { 
      try { 
       reader.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
       return null; 
      } 
     } 
    } 
} 

返回完整JSON文本之後,你可以通過解決右邊的數組/對象的JSON文本循環。 內您的AsyncTask:

String jsonText = getData("http://api.androidhive.info/json/movies.json"); 
try { 
     JSONArray jsonArray = new JSONArray(jsonText); 
     ... 
} 

後開始閱讀JSON對象

0

更新視圖,得到響應後有一個textview和setText。

+0

問題是代碼無法在while循環中輸入。我只想知道爲什麼? – a874

0

一切都是按照這一JAVA DOC

測試一下清單文件internet許可看起來不錯:

<uses-permission android:name="android.permission.INTERNET"/> 
0

你在你的catch子句中加入了一條日誌語句,但你不會看它的寫法...... 首先使用StringBuffer和BufferedReader構建整個字符串,然後纔將其轉換爲json數組或對象。

URLConnection tc = url.openConnection(); 
     BufferedReader br = new BufferedReader(new InputStreamReader(tc.getInputStream())); 

     String line; 
     while ((line = br.readLine()) != null) { 
      sb.append(line); 
     } 

     JSONArray ja = new JSONArray(sb.toString()); 
     for (int i = 0; i < ja.length(); i++) { 
      JSONObject jo = (JSONObject) ja.get(i); 
      Log.d("asd", jo.toString()); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    }