2017-06-16 38 views
0

檢索數據的問題好了,所以我試圖拉從JSON的列表中的數據像這樣的:JSONException:試圖從JSON

{"code":200,"status":"OK","data":{"timings":{"Fajr":"04:17","Sunrise":"05:30","Dhuhr":"12:20","Asr":"15:42","Sunset":"19:11","Maghrib":"19:11","Isha":"20:24","Imsak":"04:07","Midnight":"00:20"},"date":{"readable":"17 Jun 2017","timestamp":"1497652236"}}} 

專門的具體祈禱。我的代碼查找數據如下:

class SaveTheFeed extends AsyncTask<Void, Void, Void>{ 
    String jsonString = ""; 
    String result = ""; 
    EditText chosenCity = (EditText) findViewById(R.id.editText3); 
    String city = chosenCity.getText().toString(); 

    @Override 
    protected Void doInBackground(Void... voids) { 
     DefaultHttpClient httpClient = new DefaultHttpClient(new BasicHttpParams()); 
     HttpPost httpPost = new HttpPost("http://api.aladhan.com/timingsByCity?city=" + city + "&country=AE&method=2"); 
     httpPost.setHeader("Content-type", "application/json"); 
     InputStream inputStream; 

     try{ 
      HttpResponse response = httpClient.execute(httpPost); 
      HttpEntity entity = response.getEntity(); 
      inputStream = entity.getContent(); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"), 8); 
      StringBuilder builder = new StringBuilder(); 
      String line; 
      while ((line = reader.readLine()) !=null){ 
       builder.append(line + "\n"); 
      } 
      jsonString = builder.toString(); 

      JSONObject jObject = new JSONObject(jsonString); 

      JSONObject data = (JSONObject) jObject.get("data"); 

      JSONArray jArray = (JSONArray) data.get("timings"); 

      outputTimings(jArray); 

     } catch (ClientProtocolException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 

     return null; 
    } 
    @Override 
    protected void onPostExecute(Void aVoid) { 
     TextView prayerTimes = (TextView) findViewById(R.id.prayerTimes); 
     prayerTimes.setText(result); 
    } 

    protected void outputTimings(JSONArray jsonArray){ 
     String[] prayers= {"Fajr", "Sunrise", "Dhuhr", "Asr", "Sunset", "Maghrib", "Isha", "Imsak", "Midnight"}; 
     try{ 
      for(int i = 0; i < jsonArray.length(); i++){ 
       JSONObject cityObject = 
         jsonArray.getJSONObject(i); 
       result = result + prayers[i] + " : "+ 
         cityObject.getString(prayers[i]) + "\n"; 
      } 

我得到這個錯誤朝向線85點(JSONObject的jObject =新的JSONObject(jsonString);行)

06-17 00:24:15.973 2866-2907/azanmute.android.com.azanmute W/System.err: org.json.JSONException: Value of type java.lang.String cannot be converted to JSONObject 06-17 00:24:15.973 2866-2907/azanmute.android.com.azanmute W/System.err: at org.json.JSON.typeMismatch(JSON.java:111) 06-17 00:24:15.974 2866-2907/azanmute.android.com.azanmute W/System.err: at org.json.JSONObject.(JSONObject.java:160) 06-17 00:24:15.974 2866-2907/azanmute.android.com.azanmute W/System.err: at org.json.JSONObject.(JSONObject.java:173) 06-17 00:24:15.974 2866-2907/azanmute.android.com.azanmute W/System.err: at azanmute.android.com.azanmute.MainActivity$SaveTheFeed.doInBackground(MainActivity.java:85) 06-17 00:24:15.974 2866-2907/azanmute.android.com.azanmute W/System.err: at azanmute.android.com.azanmute.MainActivity$SaveTheFeed.doInBackground(MainActivity.java:60) 06-17 00:24:15.974 2866-2907/azanmute.android.com.azanmute W/System.err: at android.os.AsyncTask$2.call(AsyncTask.java:305) 06-17 00:24:15.974 2866-2907/azanmute.android.com.azanmute W/System.err: at java.util.concurrent.FutureTask.run(FutureTask.java:237) 06-17 00:24:15.974 2866-2907/azanmute.android.com.azanmute W/System.err: at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243) 06-17 00:24:15.974 2866-2907/azanmute.android.com.azanmute W/System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) 06-17 00:24:15.974 2866-2907/azanmute.android.com.azanmute W/System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607) 06-17 00:24:15.974 2866-2907/azanmute.android.com.azanmute W/System.err: at java.lang.Thread.run(Thread.java:761)

所以我的理解是Im指向數據不正確或JSONObject與JSONArrays混淆。我已經嘗試了thisthis,但仍然收到相同的錯誤。

+0

從例外,我想說的問題是你的字符串jsonString不是有效的JSON字符串。你可以在這裏進行調試,並在l之前提供jsonString的確切值。 85? – jdebon

+0

只需打印您在HTTP響應中獲得的內容,以確保該URL向您發送有效的json響應 – Zakir

+0

那麼哪個是MainActivity.java的第85行?它總是*有用於將事物縮減爲[mcve] - 目前您的問題中存在大量不相關的代碼。 –

回答

1

在這種情況下,您並未混淆JSON對象和JSON數組。這絕對是一個JSONObject。

您可能將'不可見'字符添加到JSONObject構造函數不喜歡的字符串中(即「\ n」)。試試這個:

JSONObject jObject = new JSONObject(jsonString.substring(jsonString.indexOf("{"), jsonString.lastIndexOf("}") + 1)); 

另請注意,「計時」也是一個JSONObject而不是JSONArray。一個JSONArray,其中「汽車」是JSONArray的例子:

{"name":"John","age":30,"cars":[ "Ford", "BMW", "Fiat" ]} 
+0

我繼續前進,嘗試添加您的線。它仍然錯誤,但這次它的不同錯誤: 'org.json.JSONException:未終止的對象在{ padding:30px; font:12px/1.5 Helvetica,Arial,Verdana,sans-serif; } h1 { margin:0; font-weight:normal; line-height:48px; }' 問題仍然存在於同一行 – Fencer300

+0

@ Fencer300能否爲我們的信息發佈錯誤? 編輯:謝謝 –

+0

@ Fencer300您的HTTP請求沒有返回有效的JSON,而是返回HTML頁面內容。 –