JSON-Parser

  • Schönen guten Tag,

    da ich mittlerweile komplett verzweifelt bin, hoffe ich nun hier Hilfe zu erhalten.

    Folgendes Problem:

    Ich habe mir die JSON-UDF von AspirinJunkie geladen und möchte folgende String parsen:

    String


    {"ok":true,"license":"CC BY 4.0 - https:\/\/creativecommons.tankerkoenig.de","data":"MTS-K","prices":{"1bcc4077-99e8-473e-adbb-5f1745b1c614":{"status":"open","e5":1.299,"e10":1.279,"diesel":1.129},"da69a926-9f3c-41f6-8787-9b8248f04d36":{"status":"open","e5":1.309,"e10":1.289,"diesel":1.129},"63bb1e52-8187-49f0-b3fc-c001b3ae4571":{"status":"open","e5":1.299,"e10":1.279,"diesel":1.129},"25cb4f27-48de-4aa1-829a-d362215fcc3c":{"status":"open","e5":1.309,"e10":false,"diesel":1.149}}

    Das ganze Ding lasse ich mit folgendem Code laufen:

    C
    #include <JSON.au3>
    #include <Array.au3>
    $oHttp = ObjCreate("winHttp.winHttpRequest.5.1")
    $apiURL = "URL die den String ausgibt"
    $oHttp.open("GET", $APIURL)
    $oHttp.send()
    $result = $oHttp.ResponseText
    $xxx = _JSON_Parse($result)
    $e5 = _JSON_Get($xxx,"[0].prices[0].1bcc4077-99e8-473e-adbb-5f1745b1c614[0].e5")

    Wie ihr euch denken könnt, kommt nicht das gewünschte Ergebnis raus.

    Der Rest des Programms ist dann kein Problem, aber ich schaffe es nicht die (den?) String brauchbar zu machen.

    Das Programm soll am Ende dann nur Spritpreise vergleichen.

    Schonmal vielen Dank im Vorraus,

    Chinx7

  • Es fehlen die wirklich wesentlichen Informationen:

    • Hast du einen Teststring mit dem man das ganze mal testen könnte? - ohne wird man kaum den Fehler eingrenzen können.
    • Was bedeutet "nicht das gewünschte Ergebnis" konkret?

    Edit: Siehe unter mir

    Einmal editiert, zuletzt von AspirinJunkie (9. Dezember 2017 um 10:11)

  • Ah sorry - das hatte ich nicht gesehen.

    In dem Fall lässt sich das Problem schnell eingrenzen.

    Zum einen ist der String kein korrekter JSON-String (es fehlt eine abschließende Klammer) und zum anderen ist der Selektor für _JSON_Get falsch.

    In diesem werden Array-Indizes verwendet obwohl die jeweiligen Strukturen gar keine Arrays sind.

    Beachtet man dies funktioniert es auch:

  • Entschuldigung, da ist mir beim Kopieren ein Fehler unterlaufen, der String hat eigentlich am Ende 3 Klammern.

    Den vorletzten Satz verstehe ich nicht.

    Zitat

    In diesem werden Array-Indizes verwendet obwohl die jeweiligen Strukturen gar keine Arrays sind.

    Heißt das, dass ich die "Zahlen in Klammern" nur dann angeben muss, wenn ich ein JSON-String wie folgt habe:

    Option 1

    • sOption 1
    • sOption 1
    • sOption 2

    Option 1

    • sOption 1


    Und dann "[0].Option 1[1].sOption 1" für Option 1 und die 2te sOption 1 nutzen muss?

    Ich hatte mir den @error auch mehrmals in der Konsole ausgeben lassen, habe das aus dem Code oben nur rausgenommen, dort kam allerdings immer 0.

    Soweit hat es funktioniert, es wird mir der korrekte Wert ausgeworfen.

    Vielen Dank für die Hilfe!

  • JSON kennt folgende Datentypen: Zahlen, Boolsche Werte, Nullwert, Strings.

    Diese wiederrum können in zwei verschiedene Datenstrukturen organisiert werden:

    • Objekte: eingefasst in geschweifte Klammern {...} sind dort die einzelnen Werte kommagetrennt in der Form: Attributname ("Schlüssel") : Attributwert.
      Der Zugriff auf einzelne Werte des Objektes erfolgt über den Attributnamen.
    • Arrays: eingefasst in eckige Klammern: [...] sind dort die Werte entsprechend ihrer Reihenfolge kommagetrennt hintereinander.
      Der Zugriff auf die einzelnen Werte eines Arrays erfolgt über die Position innerhalb des Arrays beginnend bei 0 (der sogenannte "Index")

    In der JSON_Get-Funktion habe ich den Abspracheselektor daher so aufgebaut dass man zur Selektion entweder einen Attributnamen (wenn die aktuelle Position ein Objekt ist) oder einen Index (wenn die aktuelle Position ein Array ist) angeben kann. Ein Attribut wird einfach durch Angabe des Namens ausgewählt, ein Arrayelement durch Angabe seines Index in eckigen Klammern. Die einzelnen Ebenen werden hierbei durch einen Punkt getrennt (obwohl ich diesen als Separator sicherlich nochmal überdenken werde).

    In deinem JSON String kommt jedoch kein einziges Array vor (keine eckige Klammer) also macht auch kein ArrayIndex bei _JSON_Get Sinn.

    Daher schmeißt dir in diesem Fall die _JSON_Get-Funktion als @error den Wert 4.

    Im Funktionsheader steht hierzu: 4: index query on none array object

    Ich weiß nicht wie ich es noch eindeutiger beschreiben kann.

  • Alles klar, ich hätte mich davor vielleicht mal in JSON einlesen sollen, das hole ich jetzt nach.

    Aber vielen Dank für die Hilfe, das hat mir auf jeden Fall weitergeholfen!