2017-06-16 5 views
0

versuchen, Ordnung so versuche ich Daten aus JSON der Listen zu ziehen, wie dies:JSONException: Probleme zum Abrufen von Daten aus 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"}}} 

ausschließlich die spezifischen Gebete. Mein Code, um die Daten zu finden, ist wie folgt:

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"; 
      } 

ich diesen Fehler, die auf Linie zeigt 85 (die JSONObject jObject = new JSONObject (jsonString); line)

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)

Also mein Verständnis ist, dass Im auf die Daten falsch zeigt oder JSONObjects mit JSONArrays verwechselt. Ich habe bereits beide und this versucht, aber immer noch den gleichen Fehler erhalten.

+0

Von der Ausnahme, würde ich sagen, das Problem ist, Ihr String jsonString ist kein gültiger JSON-String. Kannst du hier ein Debug setzen und den exakten Wert von jsonString kurz vor l angeben? 85? – jdebon

+0

Drucken Sie einfach, was Sie in HTTP-Antwort erhalten, um sicher zu sein, dass die URL Ihnen eine gültige JSON-Antwort sendet. – Zakir

+0

Also, was ist Zeile 85 von 'MainActivity.java'? Es ist * immer * nützlich, Dinge auf ein [mcve] zu reduzieren - es gibt eine Menge irrelevanter Code in deiner Frage im Moment. –

Antwort

1

Sie haben JSON-Objekt und JSON-Array in diesem Fall nicht verwechselt. Dies ist definitiv ein JSONObject.

Es ist möglich, dass Sie Ihrer Zeichenfolge "unsichtbare" Zeichen hinzugefügt haben, die der JSONObject-Konstruktor nicht mag (z. B. "\ n"). Versuchen Sie folgendes:

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

Bitte beachten Sie auch, dass „Timings“ ist auch ein JSONObject und kein JSONArray. Beispiel eines JSONArray, wobei „Autos“ sind der JSONArray:

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

Ich ging voran und ich versuche, Ihre Zeile hinzuzufügen. Es ist immer noch Fehler, aber diesmal ist es ein anderer Fehler: 'org.json.JSONException: Nicht abgeschlossenes Objekt bei Zeichen 84 von { Padding: 30px; Schriftart: 12px/1.5 Helvetica, Arial, Verdana, serifenlos; } h1 { Rand: 0; Schriftgewicht: normal; Zeilenhöhe: 48px; } ' mit dem Problem in der gleichen Zeile bleiben – Fencer300

+0

@ Fencer300 könnten Sie den Fehler für unsere Informationen veröffentlichen? Bearbeiten: Danke –

+0

@ Fencer300 Ihre HTTP-Anfrage gibt keine gültige JSON zurück, es gibt den Inhalt der HTML-Seite zurück. –

Verwandte Themen