JSON parsen mit org.json lib



  • Servus allerseits,

    ich versuche gerade mit dieser library : http://www.json.org/java/ eine kleine JSON-File nach Informationen zu parsen.

    Diese wird generiert durch mein Request an die Google Maps Distance API.

    So sieht mein aktuelles Beispiel aus:

    {
       "destination_addresses" : [ "Irgendeine Adresse als Startpunkt" ],
       "origin_addresses" : [ "Irgendeine andere Adresse als Zielpunkt" ],
       "rows" : [
          {
             "elements" : [
                {
                   "distance" : {
                      "text" : "0,6 km",
                      "value" : 585
                   },
                   "duration" : {
                      "text" : "2 minutes",
                      "value" : 120
                   },
                   "status" : "OK"
                }
             ]
          }
       ],
       "status" : "OK"
    }
    

    Bin leider sehr wenig vertraut mit dem JSON-Format, aber es sieht eigentlich recht simpel aus, allerdings schein ich es irgendwie trotzdem nicht zu verstehen.

    Ich will jetzt beispielweise die Distanz in Text, also das "0.6km" rausfinden.

    Versuche dazu diesen Aufruf:

    obj.getJSONArray("rows").getJSONObject(0).getJSONObject("distance");
    

    Allerdings:

    Exception in thread "main" googlemapsapi.JSONException: JSONObject["distance"] not found.
    	at googlemapsapi.JSONObject.get(JSONObject.java:472)
    	at googlemapsapi.JSONObject.getJSONObject(JSONObject.java:572)
    	at googlemapsapi.GoogleMapsAPI.main(GoogleMapsAPI.java:45)
    

    Folgendes: Das erste Suchen nach dem JSONArray "rows" funktioniert. Danach wirds für mich schon komisch. Ich hab zunächst danach wieder einen getJSONArray(0); call gepackt, allerdings wird behauptet das Ergebnis sei kein JSONArray.

    Sieht für mich in dem Format allerdings so aus, schließlich steht da "elements :[" und ich dachte diese eckige Klammer indiziert ein Array.

    Nun gut, wenn ich es mit getJSONObject(0) mache, dann funktioniert es. Allerdings komme ich danach auf gar nichts mehr weiter.
    Denn, die Fehlermeldung oben behauptet, dass es dieses "distance" nicht findet.

    Kennt jemand die Library, die ich verwende und benutze ich sie eventuell falsch oder verstehe ich auch das JSON Format nicht richtig?

    Danke schon mal fürs Durchlesen 🙂



  • Okay, da die Klassen zum Glück toString() implementieren, konnte ich nachvollziehen, wie es wohl richtig geht.

    Der korrekte Aufruf lautet:

    obj.getJSONArray("rows").getJSONObject(0).getJSONArray("elements").getJSONObject(0).getJSONObject("distance").getString("text");
    

    Keine Ahnung, wieso. Ich könnte es nur mit Klammern erklären, daher bin ich ja darauf gekommen.
    Sonderlich logisch finde ich es allerdings nicht.



  • Hab JSON ehrlich gesagt auch nie wirklich verstanden, aber afaik ist es doch so, das deine Klasse immer ein JSONObject ist und die Attribute der Klasse dann in einem JSONArray liegen.

    Also ein JSONObject hat nie ein JSONObject, sondern immer ein JSONArray.

    btw was mich an JSON auch irritiert hat war, dass es aus zB einem String Attribute mit dem Wert "null" einfach einen Leerstring (also "")gemacht hat oder eben aus einem Integer "null" dann "0". Sollte laut http://www.json.org/ nicht so sein (wenn ich das richtig verstehe), somit lag/liegt da der Fehler wohl eher bei mir.

    Grundsätzlich hätte ich jetzt auch gedacht, dass man den JSON String in sein eigenes Datenobjekt parst und dann kannst du ja sowieso wie obj.getRows(0).getElements(0).getDistance() machen 🤡

    Aber wie gesagt, ich hab keinen Ahnung.


Log in to reply