• 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 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:

    Man kann mit der UDF auch verschachtelte AutoIt-Strukturen (welche z.B. von _JSON_Parse() erzeugt wurden) erzeugen und verändern:

    >>Download und Quellcode auf GitHub<<


    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
    2019/03/03
    • _JSON_Get: Keys mit "+" am Ende werden nun auch geparst
    2020/05/21
    • Unicode-Escapes (\uxxxx) wurden nicht korrekt übersetzt
    2020/10/21
    • Fix: Stack-Overflow (Error 1073741571) beim String-Parsing
    • i.V.m. Fix: Performanceverbesserung beim Parsen großer Strings
    • Fix: Hex-Unicode-Escapes wurden nicht übersetzt.
    2020/12/29
    • _JSON_Get(): Unterstützung von Map-Datentyp (derzeit nur AutoIt-Beta-Versionen)
    • _JSON_Generate(): Unterstützung von Map-Datentyp (derzeit nur AutoIt-Beta-Versionen)
    • _JSON_Parse: Neuer Parameter $bUseMaps - falls "true" dann werden aus Objekten AutoIt-Maps anstatt Scripting.Dictionary-Objekte erstellt (derzeit nur AutoIt-Beta-Versionen)
    2021/01/07
    • _JSON_Parse(): Objekt-Keys können nun auch Leerstrings sein
    • _JSON_Parse(): Workaround für einen Bug in Number()
    2021/02/09
    • _JSON_Generate():
      • Die Funktion verändert die Ursprungsstruktur nicht mehr
      • 2D-Arrays deren Zeilen leere Elemente am Ende enthalten, werden kompakter abgebildet (siehe __Array2dToAinA())
    2021/10/25
    • Kompatibilität mit Opt("MustDeclareVars", True) hergestellt (thx mko)
    2022/10/19
    • Script-Breaking!: _JSON_Parse generiert für JSON-Objekte nun AutoIt-Maps anstatt Scripting.Dictionary-Objekte. Die letzte Version mit Dictionary liegt im Anhang als JSON_Dictionary.au3.
    • __JSON_FormatString(): @Tab wird nun durch \t escaped. (thx mko)
    2023/01/03
    • Leichte Performanceverbesserung durch Neuimplementierung der Funktion __JSON_ParseString()
    2023/01/16
    • _JSON_addChangeDelete(): Neue Funktion mit der verschachtelte AutoIt-Datenstrukturen leicht erzeugt und verändert werden können
    • _JSON_Get(): Punkte in Schlüsselnamen sind nun auch möglich indem man sie durch "\" escaped. Um "\" darzustellen muss man sie nun doppeln: "\\"
    2023/05/23
    • _JSON_GenerateCompact() hinzugefügt: Abkürzung um möglichst kompakten JSON-Code zu erstellen anstatt die Parameter mit _JSON_Generate() händisch einzutragen.

    27 Mal editiert, zuletzt von AspirinJunkie (8. Februar 2024 um 17:25)

  • 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?

    Grüße autoiter

  • 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.

    • Offizieller Beitrag

    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
    #include <JSON.au3>
    
    Global $s_String = '{ "image": { "url": "https://*********", "isDefault": false } }'
    Global $o_Object = _JSON_Parse($s_String)
    
    Global $s_URL = _JSON_Get($o_Object, "image.url")
    
    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
    #include <JSON.au3>
    
    Global $s_String = '{ "error": { "errors": [ { "locationType": "header", "location": "Authorization" } ], "code": 401, "message": "Invalid Credentials" } }'
    
    Global $o_Object = _JSON_Parse($s_String)
    Global $s_location = _JSON_Get($o_Object, "error.errors[0].location")
    
    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

    Einmal editiert, zuletzt von AspirinJunkie (14. Januar 2018 um 16:27)

  • Moin zusammen

    Ich habe eine Frage bezüglich der Lizenzsierung der UDF

    Ich bin gerade dabei mir ein Programm zu schreiben welches nach einer Windowsinstallation weitere Programme installiert und habe dafür deine JSON UDF verwendet um die Konfiguration zu laden

    Jetzt überlege ich meinen Quellcode ggf freizugeben für den Privaten Gebrauch und einen selbstverfassten Lizenztext hinzuzufügen und weiss nicht wie ich das wegen der Benutzung der Fremdbibliothek machen soll

    Desshalb die frage unter welche Lizenz die UDF selber steht ;)

    MFG: Lutz

  • Wow diese kannte ich sogar noch garnicht :D

    Danke ersteinmal das die UDF so freizügig gehandelt wird

    Dann werde ich mal schauen das ich mein Script fertig mache um es online zu stellen

  • Hallo AspirinJunkie !

    Die WTFPL-Lizenz (= Do What The Fuck You Want To Public License) klingt natürlich schon allein vom Namen her verlockend ;). Sie bringt genau das 'rüber, was die meisten zum Thema 'Lizenzen' denken. Allerdings hat sie kleine Schwächen.

    siehe : https://de.wikipedia.org/wiki/WTFPL

    Auszug :

    ... Um ein Werk ohne Einschränkungen als Public Domain freizugeben, wird die CC0 empfohlen da diese speziell für Kompatibilität mit den verschiedenen internationalen Rechtssystem geschrieben wurde (im Gegensatz zur WTFPL, deren Rechtsverbindlichkeit im Klagefall unklar ist).

    Ich würde daher auch für eine Creative Commons Lizenz plädieren, z.B. die CC0 !

    siehe : https://de.wikipedia.org/wiki/Creative_Commons

    Auszug :

    CC0 (gesprochen cc zero) vereinigt in sich zwei rechtliche Werkzeuge, eine Verzichtserklärung und eine bedingungslose Lizenz. Die bedingungslose Lizenz fungiert als Rückfallposition (englisch „fallback license“) für den Fall, dass die vorrangige Verzichtserklärung nach dem jeweils geltenden Recht nicht voll wirksam ist. Mit der Verzichtserklärung wird der Verzicht auf sämtliche Schutzrechte erklärt. Dadurch soll das jeweilige Werk durch den Urheber bzw. Rechteinhaber aktiv in die Gemeinfreiheit überführt werden (englisch „voluntary public domain“).[36] Wenn diese Überführung rechtlich nicht möglich ist – wie beispielsweise in Deutschland oder Österreich – stellt die in CC0 enthaltene „Fallback License“ gewissermaßen eine Creative-Commons-Lizenz ohne die sonst üblichen Lizenzbedingungen (BY, SA, ND, NC, siehe oben) dar.
    Falls Du eine CC-Lizenz mit Namensnennung bevorzugst, dann -> CC-BY 3.0 DE


    Falls Dich das Ganze nicht interessiert, kannst Du selbstverständlich bei der WTFPL-Lizenz bleiben. Große Rechtstreite sind im vorliegenden Fall ja eher nicht zu erwarten ;).

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Falls Dich das Ganze nicht interessiert, kannst Du selbstverständlich bei der WTFPL-Lizenz bleiben. Große Rechtstreite sind im vorliegenden Fall ja eher nicht zu erwarten ;).

    Passend zusammengefasst.

    Die wtfpl ist für mich gerade so vertretbar für eine Thematik mit der ich mich in meinem Hobbybereich eigentlich überhaupt gar nicht beschäftigen will. Die CC scheidet daher für mich auch schon aus da ich dort ja meine wünsche erst zusammenklicken muss. Jeder klick für diese Thematik ist für mich hierzu verschwendet wenn es wie hier mein hobby betrifft.

  • Ich sehe schon das ich ein heikles Thema angesprochen habe

    Meine Überlegung war auch eigentlich nur das wenn ich etwas kostenlos Veröffentliche nicht der nächste hingeht und es weiterverkauft

    Das ist der Grund warum ich mich damit auseinandersetzen wollte n Lizenztext beizugeben

  • Passend zusammengefasst.

    Der Beitrag war auch nur als Anregung für Dich gedacht.

    Als Urheber musst Du im Grunde überhaupt keine Lizenz etc. angeben. Das Problem läge bei den Nutzern deiner UDF, da sie dann nicht wissen was sie machen dürfen. Eine Lizenzierung unter CC0 wäre auch nicht aufwändig - es reicht die entsprechende Angabe. Diese Entscheidung hast Du aber bereits getroffen und da will ich nicht weiter nerven :).

    Ich sehe schon, dass ich ein heikles Thema angesprochen habe.

    Meine Überlegung war auch eigentlich nur das wenn ich etwas kostenlos veröffentliche nicht der nächste hingeht und es weiterverkauft.

    Das ist der Grund warum ich mich damit auseinandersetzen wollte einen Lizenztext beizugeben

    Hallo Lutz Ifer !

    Heikel ist das Thema eigentlich nicht, nur wenig erbaulich ^^.

    Bei Dir liegt die Sache anders, da Du ja gewisse Einschränkungen machen willst. Für Dich wäre die WTFPL-Lizenz nicht geeignet. Zudem sind die CC-Lizenzen allgemein etabliert.

    Schaue Dir mal den Link für die CC Lizenztypen an : https://de.wikipedia.org/wiki/Creative_Commons

    Beispiel : CC-BY-NC-SA 3.0 DE

    Falls Du noch weitere Fragen hast, nur zu !

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Hi zusammen,

    mir gefällt deine JSON UDF verdammt gut und nutze die sehr gern.

    Soweit komme ich auch mit klar und es funktioniert, bei einzelnen bzw. geziehlten Abfragen.

    Ich wollte dich/euch mal fragen wie ich folgendes dynamischer machen könnte:

    Bei meiner echten JSON Abfrage bekomme ich bei "card" ein oder mehrere Rückgaben, mit einer jeweils nicht vorhersehbaren Nummer (zb. card.202, card.208).

    Gibt es eine Möglichkeit das ich beispielsweise nur ein _JSON_Get($o_Object, ".card") mache und dann alle Objekte ausgelesen bekomme?

    Bzw, kann ich, auch zu debug zwecken, mir den Inhalt dieser Objekte ($o_Object) in der Console, oder in ein Label ausgeben lassen?

    Eine weitere Frage wäre, kennt einer eine Möglichkeit die Objekte zu zählen?

    Ich würde gerne im obigen Beispiel wissen "wie viele" Objekte ich in "card" habe.

    Hier wären es dann die Anzahl "2" (card 202 und 208).

    Vielen Dank schon mal. :)