• Hi AspirinJunkie , hi liebe Mitlesende 👋 .

    Ich könnte die Frage auch via GitHub issues stellen, doch zum einen passiert hier ja sonst nicht viel 😅 und zum anderen interessiert es vielleicht noch jemand hier, der nicht auf GitHub aktiv ist (who knows).

    Einleitung:

    Ab und an mache ich doch mal noch etwas mit AutoIt, neben anderen Sprachen in denen ich beruflich unterwegs bin.
    Dann kam deine Meldung zur Performance-Verbesserung deiner JSON.au3 UDF und prompt hatte ich mal wieder ein wenig Lust aktiv zu werden 😀 .

    Fragestellung:

    Warum existiert eigentlich kein "Array to JSON" in der UDF? Vielleicht tut es das (indirekt) und ich habe 🍅 auf den Augen, doch ich fand es vor zwei Wochen nicht.
    Also _JSON_Generate verhält sich sicher wie gewünscht, doch entspricht dies nicht dem output JSON string den ich "brauche" #spielerei.

    Code (mit Beispieldaten):

    1. Schaue dir doch mal bitte die verschiedenen JSON output Dateien an (im Verzeichnis output nach Skriptausführung).
    2. _JSON_Generate hat einen Zeilen-Fokus (so nenne ich es mal). Somit sind alle Zeilen dann auch JSON arrays.
      Jedoch wollte ich einen Spalten-Fokus (erste Spalte Key, erste Zeile dann Value). Erschließt sich besser wenn man es siehst.
    3. Mir ist klar, dass keine nested Array in Array Kombinationen mit _ArrayToJson abgebildet werden können, ist auch gar nicht der Anpruch.

    Wäre dies etwas was in die UDF passen würde? Falls ja, dann stelle ich gern den PR dazu, außer du willst es ganz anders - wie ich dich kenne performanter - machen 😇 .

    JSON.au3 download

    Output:

    json-generate-table.json
    array-to-json-table.json
    json-generate-list.json
    JSON
    [
    	"Weekday",
    	"Monday",
    	"Tuesday",
    	"Wednesday",
    	"Thursday",
    	"Friday",
    	"Saturday",
    	"Sunday"
    ]
    array-to-json-list.json


    Viele Grüße
    Sven

  • Die JSON-UDF weiß nichts darüber wie du die Daten semantisch interpretieren möchtest.
    JSON kennt nur Syntax.
    Und hier haben wir auch noch den Fall, dass JSON das Konzept von 2D-Arrays nicht kennt.
    Es kennt nur zwei Datenstrukturen als Verschachtelungsebene: Listen (quasi 1D-Arrays) und Objekte (Key-Value-Strukturen).
    Und da JSON nur die Syntax betrachtet, kann sie z.B. aus deinem verschachtelten Array-In-Array nicht ableiten, dass dort das erste Element die Headereinträge meint und danach die Zeilen einen Bezug zu diesem Header haben.
    Semantik ist nicht die Aufgabe von JSON - und damit auch nicht von der UDF.
    Daher wird es dort auch keine Funktion geben die aus einem 2D-Array eben keine verschachtelte Liste, wie man es aus dem Aufbau der Datenstruktur ableiten würde, sondern eine Liste von Objekten - denn das gibt die Syntax schlicht nicht her und eine andere Interpretation auf die Daten zu finden ist Sache des Users selbst.

    Hierfür muss man sich also was eigenes basteln. Oder wie im Falle der 2D-Tabellenstruktur Funktionen nutzen die die Arrays eben als solche Tabellen interpretiert. Ich hatte hierzu mal die TableData-UDF gebastelt. Die macht im Grunde genau das was deine _ArrayToJson() macht. Sie konvertiert ein 2D-Array so in ein 1D-Array mit Maps als Elementen, dass die erste Zeile als Key-Namen interpretiert wird und man dann das gleiche Ergebnis z.B. so erreichen würde:

    Das ist halt mal eine Funktion, welche die Daten semantisch genauso interpretiert wie du es auch getan hast.
    Das hat mit JSON aber erstmal nichts zu tun sondern nur wie die Daten eben aufgefasst werden.
    JSON macht dann nur die Konvertierung zwischen dem JSON-String und der internen Datenstruktur - es interpretiert nichts.

    Der einzige Punkt bei dem die UDF eine Funktionalität anbietet um Datenstrukturen in andere zu konvertieren ist bei der Konvertierung zwischen 1D und 2D-Arrays (bzw. Array-In-Arrays). Dies ist jedoch schlicht nur der Fall, da hierfür eine Notwendigkeit besteht denn JSON kann wie gesagt nichts mit mehrdimensionalen Arrays anfange.

    Bei der Liste hingegen habe ich kein Pendant.
    Die Interpretation, dass der erste Eintrag eines 1D-Array der einzige Key einer Map sein soll und alle anderen Elemente als 1D-Array als Value dieses Keys behandelt werden sollen ist schlicht halt sehr individuell und bedarf daher auch einer individuellen Behandlung.

    Kurz: Ja klar kann man Daten hin und her transformieren wie man möchte - die JSON-UDF ist dafür halt nur der falsche Ort.

  • Es ist wie immer ein Vergügen mit dir, Dankeschön für die gute Erläuterung 🤝 .

    Daher wird es dort auch keine Funktion geben die aus einem 2D-Array eben keine verschachtelte Liste, wie man es aus dem Aufbau der Datenstruktur ableiten würde, sondern eine Liste von Objekten - denn das gibt die Syntax schlicht nicht her und eine andere Interpretation auf die Daten zu finden ist Sache des Users selbst.

    Kurz: Ja klar kann man Daten hin und her transformieren wie man möchte - die JSON-UDF ist dafür halt nur der falsche Ort.

    Verstanden und nachvollziehbar!

    Bei der Liste hingegen habe ich kein Pendant.
    Die Interpretation, dass der erste Eintrag eines 1D-Array der einzige Key einer Map sein soll und alle anderen Elemente als 1D-Array als Value dieses Keys behandelt werden sollen ist schlicht halt sehr individuell und bedarf daher auch einer individuellen Behandlung.

    Auch hierbei gebe ich dir Recht, dies muss der User der UDF selbst berücksichtigen bzw. seine Daten entsprechend vorher aufbereiten 👌 .

    ==> https://github.com/Sylvan86/autoi…r/TableData.au3 schaue ich mir (nochmal) genauer an. Hatte ich vor Monaten bin ich der Meinung, doch vor zwei Wochen ist mir deine UDF nicht eingefallen. Naja, mit fast 40 Jahren - cheers Andi - vergisst man die ersten Sachen eben 😂 .

    Alles klar, merci. Einen angenehmen Tag noch 🤝 .

    Viele Grüße
    Sven