• Aufgrund einer Shoutbox-Diskussion und meiner Unzufriedenheit mit bisherigen JSON-UDFs habe ich mich mal rangesetzt und meine Vorstellungen wie eine solche auszusehen hat umgesetzt.
    Die bisherigen UDFs sind meiner Meinung nach entweder unnötig umständlich, haben externe Abhängigkeiten oder kommen nicht mit Dictionaries klar.
    Daher folgt die UDF folgenden Prämissen:

    • Ein JSON-String wird mit einer einzigen Funktion komplett in eine native (+ Scripting.Dictionary) AutoIt-Datenstruktur zur Weiterverarbeitung konvertiert. (Funktion _JSON_Parse)
    • Andersherum kann aus beliebigen AutoIt-Datenstrukturen ein JSON-String erzeugt werden. (Funktion _JSON_Generate)
    • Abfragen können entweder direkt in den AutoIt-Variablen stattfinden oder etwas sicherer in einer sehr simplen Abfragesprache (Funktion _JSON_Get)

    Wer also ähnlich tickt wie ich findet eventuell hiermit eher seine Vorstellungen umgesetzt.


    Wie verwendet man es nun? - na dann siehe hier:

    Meine Versuche waren alle zufriedenstellend.
    Bugs sind aber logischerweise nicht auszuschließen und können gerne hier gemeldet werden.


    Changelog:

    2017/08/21
    • _JSON_Generate: Bug bei 2D-Arrays behoben
    2017/08/22
    • Ausgabe von _JSON_Generate individualisierbar
    2017/08/27
    • stabilere Stringdefinition
    • _JSON_Generate: Static string wird aufgeräumt
    • offizielle Whitespace-Definition statt \s
    2017/09/04
    • _JSON_Generate: Zahlenausgabe nun so kompakt wie möglich
    2017/10/10
    • Große Arrays werden nun schneller geparst (selbes Prinzip wie in der DynArray-UDF verwendet)
    2017/10/11
    • Bug in _JSON_Generate behoben (Escapen von Backslashes fügte ein " hinzu)
    • deutlich stabilerer Umgang mit Escape-Zeichen in Strings
    • Performance-Verbesserungen (ohne Umweg über Hilfsfunktion direkter Zugriff per StringRegExp)
    2017/10/16
    • _JSON_Generate: Rundungsfehler bei großen Zahlen behoben
    2017/10/31
    • _JSON_Parse: Unicode-Escapes werden nun konvertiert.
    2018/01/11
    • _JSON_Parse: Performanceverbesserung durch optimierte RegEx-Pattern.
    • _JSON_ParseString: bessere Performance
  • Hallo @AspirinJunkie,
    vielen Dank für deine UDF und das Beispiel :)


    Ich kann nicht behaupten, dass ich den Code auf den ersten Blick verstehe und ich habe nur dein Beispiel getestet. Allerdings sehen die Beispiele super aus und ich will das noch testen. Eine JSON UDF kann ich definitiv gebrauchen.


    Wäre es Quatsch auch direkt eine Umwandung von xDArray zu JSON und umgekehrt einzubauen?

  • Wäre es Quatsch auch direkt eine Umwandung von xDArray zu JSON und umgekehrt einzubauen?

    Wenn du damit mehrdimensionale Arrays meinst: 2D Arrays sollte die UDF bereits konvertieren (wird dann im Grunde ein Array in Array):


    Umgekehrt (Also JSON in ein 2D-Array) würde so direkt nicht gehen, da man in JSON-Syntax nicht sehen kann ob es sich um ein 2D-Array handelt oder um ein Array-In-Array.
    Es ist daher dem User überlassen die Struktur entsprechend zu interpretieren. Im Beispiel hier findest du einen Ansatz wie man dies bewerkstelligen kann.
    3D und mehr halte ich persönlich für ziemlich exotisch und würde es daher dem User überlassen diese vorher in Array-In-Array Strukturen aufzubrechen.


    Edit: Aber danke für deinen Hinweis - hab es gleich mal getestet und gleich den ersten Bug hierzu gefunden.
    Hab es oben aktualisiert - nun sollten auch 2D-Arrays gehen.

  • Gefällt mir gut :thumbup: 
    Seitdem ich angefangen hatte mich intensiver mit dem Editor Sublime Text zu beschäftigen, hatte ich auch mit JSON-Dateien zu tun, die die Basis für viele Einstellungen und PlugIns dieses Editors darstellen. Und das ist wirklich eine feine Sache. Ich hatte schon damit geliebäugelt, verstärkt JSON für meine AutoIt-Skripte zu verwenden, aber eine vernünftige Schnittstelle fehlte.
    Soweit ich das bisher sehe, könnte diese UDF die Lücke bestens ausfüllen.
    Danke @AspirinJunkie

  • Wow... finde deine UDF echt super! Die erste sinvolle JSON UDF die ich gefunden hab :thumbup:

    Jetz hätt ich nur eine Frage zur Benutzung. Folgenden String liegt mir vor:


    { "image": { "url": "https://*********", "isDefault": false } }


    wie kann ich jetzt den Wert des Parameters "url" abfragen?


    EDIT: Wie kann ich generell die Objekthierarchie händeln, heißt JSON-Objekte in JSON-Objekte und dann erst die Attribute.


    Danke schonmal, NO1 :-)

  • wie kann ich jetzt den Wert des Parameters "url" abfragen?

    AutoIt
    1. #include <JSON.au3>
    2. Global $s_String = '{ "image": { "url": "https://*********", "isDefault": false } }'
    3. Global $o_Object = _JSON_Parse($s_String)
    4. Global $s_URL = _JSON_Get($o_Object, "image.url")
    5. MsgBox(0,"URL", $s_URL)

    EDIT: Wie kann ich generell die Objekthierarchie händeln, heißt JSON-Objekte in JSON-Objekte und dann erst die Attribute.

    Wie bitte? - das habe ich nicht verstanden.

  • Vielen Dank für deine schnelle Hilfe! Funktioniert ja super :)! :thumbup:


    Wie bitte? - das habe ich nicht verstanden.


    Ja hast meine Frage dadurch schon beantwortet. Ein JSON-Objekt ist immer der Inhalt zwischen den geschweiften Klammern...

    Wenn ich hier jetzt zum Beispiel "location" auslesen will, wie mach ich das dann? Beginnen die Indicies auch bei 0?

    { "error": { "errors": [ { "locationType": "header", "location": "Authorization" } ], "code": 401, "message": "Invalid Credentials" } }


    Tut mir leid, dass ich soviel nachfrag, aber die UDF begeistert mich grad voll... ^^

  • Wenn ich hier jetzt zum Beispiel "location" auslesen will, wie mach ich das dann?

    AutoIt
    1. #include <JSON.au3>
    2. Global $s_String = '{ "error": { "errors": [ { "locationType": "header", "location": "Authorization" } ], "code": 401, "message": "Invalid Credentials" } }'
    3. Global $o_Object = _JSON_Parse($s_String)
    4. Global $s_location = _JSON_Get($o_Object, "error.errors[0].location")
    5. MsgBox(0,"Location", $s_location)


    Ein JSON-Objekt ist immer der Inhalt zwischen den geschweiften Klammern...

    Wenn ich hier jetzt zum Beispiel "location" auslesen will, wie mach ich das dann? Beginnen die Indicies auch bei 0?

    Deine Frage drehte sich halt nicht um Objekte sondern um Arrays und deren Indizierung.
    Daher war mir nicht klar was du meintest.

  • Also vielen Dank, funktionier wunderbar.

    Deine Frage drehte sich halt nicht um Objekte sondern um Arrays und deren Indizierung.
    Daher war mir nicht klar was du meintest.

    Zu dem Zeitpunkt gings mir noch nicht um die Arrays, aber danke, dass du mir die Frage auch gleich beantwortet hast ^^.

    Letzte Frage: Kann ich hier zum Beispiel überprüfen, ob "error" überhaupt existiert?

    '{ "error": { "errors": [ { "locationType": "header", "location": "Authorization" } ], "code": 401, "message": "Invalid Credentials" } }'

  • Versuch doch mit Get die Daten zu lesen und schau dann inden Rückgabewert + @error.

  • Letzte Frage: Kann ich hier zum Beispiel überprüfen, ob "error" überhaupt existiert?

    Ja - indem du @error der Funktion entsprechend auswertest:


    Edit: tja - alpines war schneller