2012-11-29 96 views
0

我得到的代碼得到JSONArrays,但是當我嘗試獲得僅包含一個JSONArrayJSONObject時,它會給我空的JSONArray嘗試使用一個JSONArray解析JSONObject時的空JSON響應

例如,如果我需要從這個JSONObject獲取數據:

{"events":[{"start":1357714800,"end":1357736400,"name":"Example1","description":""}]} 

我得到{"events":[]}JSONObject[]這意味着它不包含任何JSONArrays。在這種情況下,長度爲JSONObject也是0.但它不會拋出任何種類的Exceptions

但如果JSONObject包含多個JSONArrays這樣的:

{"events":[{"start":1357714800,"end":1357736400,"name":"Example1","description":""},{"start":1357714600,"end":1357736500,"name":"Example2","description":""},{"start":1357514800,"end":1357536400,"name":"Example3","description":""}]} 

然後我的代碼運行完美。

這裏是我用來解析JSON代碼:

private void getObjects(String url) throws JSONException, Exception { 
     JSONObject jsonObject = new JSONObject(new NetTask().execute(url).get()); 
     JSONArray job1 = jsonObject.getJSONArray("events"); 
     System.out.println(jsonObject.toString()); 
     System.out.println("JOB1 LENGTH: "+job1.length()); 
     for (int i = 0; i < job1.length(); i++) { 
      JSONObject jsonEvent = job1.getJSONObject(i); 
      int start = jsonEvent.getInt("start"); 
      int end = jsonEvent.getInt("end"); 
      String name = jsonEvent.getString("name"); 
      String description = jsonEvent.getString("description"); 
     } 
    } 

    public class NetTask extends AsyncTask<String, Integer, String> 
    { 
     @Override 
     protected String doInBackground(String... params) 
     { 
      String jsonText = ""; 
      BufferedReader reader = null; 
      try { 
       URL url = new URL(params[0]); 
       reader = new BufferedReader(new InputStreamReader(url.openStream())); 
       StringBuffer buffer = new StringBuffer(); 
       int read; 
       char[] chars = new char[1024]; 
       while ((read = reader.read(chars)) != -1) { 
        buffer.append(chars, 0, read); 
       } 

       jsonText = buffer.toString(); 
      } catch (MalformedURLException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } finally { 
       if (reader != null) { 
        try { 
         reader.close(); 
        } catch (IOException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
       } 
      } 
      return jsonText; 
     } 
    } 

有什麼不對勁,我很想念,或者這是正常的行爲?

+0

嘗試記錄您從網上收到的Json文本,以確保所有這些東西都在那裏。 – mbwasi

回答

1

我試過你給定的代碼(雖然我只是讓AsyncTask只返回單個數組字符串,並且必須用jsonEvent.getString()來替換opptunti.getString())。它工作得很好,除了你可能阻止UI線程等待服務器響應。

我的猜測是問題是你打錯了URL,參數是錯誤的或類似的東西。

+0

「oppitunti」是錯字。在你說URL有錯誤之後,我去檢查它並發現所有「空」數組在名稱中都有空格,例如url是這樣的「/ json%20array」,而我只是輸入「/ json數組」作爲字符串,所以我認爲這解決了我的問題。謝謝!順便說一句,你知道哪種方法更快,你的AsyncTask返回單個數組字符串還是我的返回整個字符串? –

+0

哦,我的意思是我只是刪除了所有的網絡資料,只是返回了你列出的靜態字符串(帶有單個數組的那個,而不是多個數組的那個),而不是擊中Web服務。很高興它對你有效! – ajpolt