2017-06-16 108 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页面内容。 –