Wie kann ich eine JSON-Datei rekursiv in AutoHotkey durchlaufen? Topic is solved

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

User avatar
google
Posts: 34
Joined: 16 Nov 2022, 17:19

Wie kann ich eine JSON-Datei rekursiv in AutoHotkey durchlaufen?

Post by google » 28 Apr 2024, 17:31

Liebe Community,

ich arbeite gerade an einem Projekt in AutoHotkey und stehe vor der Herausforderung, eine JSON-Datei rekursiv zu durchlaufen. Da AutoHotkey keine integrierte Unterstützung für JSON bietet, muss ich eine externe Bibliothek verwenden. Ich habe bereits die JSON-Bibliothek von cocobelgica eingebunden, bin mir aber nicht sicher, wie ich eine rekursive Funktion erstellen kann, um die JSON-Struktur zu durchlaufen.

https://github.com/cocobelgica/AutoHotkey-JSON

Könnt ihr mir dabei helfen? Ich möchte eine Funktion erstellen, die jede Eigenschaft und ihren Wert in der JSON-Datei ausgibt, einschließlich der Unterelemente.

Code: Select all

#Requires Autohotkey v2.0
#SingleInstance Force


#Include "..\Lib\JXON.ahk"
X := FileRead("xxx.json")
JsonParsen := jxon_load(&X)

TJson(JsonParsen)
TJson(json, depth:=0) {
    for key, value in json {
		if (IsObject(value))
		   TJson(value, depth+1)

MsgBox key "|" value
    }
}

Vielen Dank im Voraus für eure Hilfe!

just me
Posts: 9763
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Wie kann ich eine JSON-Datei rekursiv in AutoHotkey durchlaufen?  Topic is solved

Post by just me » 30 Apr 2024, 02:34

Moin,

ich bin mir nicht sicher, was genau Du willst, aber hier sind zwei (vielleicht) passende Beispiele (AHK v2):

Code: Select all

ParseObj1(Obj, Indent := "") {
   Out := ""
   For Key, Value In Obj {
      If IsObject(Value) {
         Out .= Indent . Key . " = *" . "`r`n"
         Out .= ParseObj(Value, Indent . "    ")
      }
      Else
         Out .= Indent . Key . " = " . Value  . "`r`n"
   }
   Return Out
}

Code: Select all

ParseObj2(Obj, Path := "") {
   Out := ""
   Path .= (Path = "" ? "" : ".")
   For Key, Value In Obj {
      Path .=
      If IsObject(Value) {
         Out .= Path . Key . " = *" . "`r`n"
         Out .= ParseObj(Value, Path . Key)
      }
      Else
         Out .= Path . Key . " = " . Value  . "`r`n"
   }
   Return Out
}

User avatar
google
Posts: 34
Joined: 16 Nov 2022, 17:19

Re: Wie kann ich eine JSON-Datei rekursiv in AutoHotkey durchlaufen?

Post by google » 30 Apr 2024, 09:28

Vielen Dank! Du hast mein Anliegen treffend erkannt und mir die richtige Lösung gegeben.
Es haben sich zwei kleine Flüchtigkeitsfehler im Code eingeschlichen.
Falls jemand auf ähnliche Probleme in diesem Thread stößt, möchte ich diese gerne korrigieren.


Code: Select all

ParseObj1(Obj, Indent := "") {
   Out := ""
   For Key, Value In Obj {
      If IsObject(Value) {
         Out .= Indent . Key . " = *" . "`r`n"
         Out .= ParseObj1(Value, Indent . "    ") ;>>Hier sollte der Aufruf von ParseObj1 sein
      }
      Else
         Out .= Indent . Key . " = " . Value  . "`r`n"
   }
   Return Out
}


Code: Select all

ParseObj2(Obj, Path := "") {
   Out := ""
   Path .= (Path = "" ? "" : ".")
   For Key, Value In Obj {
      Path .= ;>> Ich glaube, das ist zu viel, das sollte dort nicht stehen.
      If IsObject(Value) {
         Out .= Path . Key . " = *" . "`r`n"
         Out .= ParseObj2(Value, Path . Key) ;>> Hier natürlich ParseObj2
      }
      Else
         Out .= Path . Key . " = " . Value  . "`r`n"
   }
   Return Out
}

just me
Posts: 9763
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Wie kann ich eine JSON-Datei rekursiv in AutoHotkey durchlaufen?

Post by just me » 01 May 2024, 05:55

google wrote: Es haben sich zwei kleine Flüchtigkeitsfehler im Code eingeschlichen.
Ja, das passiert mir immer wieder wenn ich beim posten den Code noch ändere. In diesem Fall habe ich den Funktionen unterschiedliche Namen gegeben, leider nicht überall! Der andere Fehler ist ein Überbleibsel aus meinem v1 Test. In v1 ist er unschädlich. Danke für die Korrekturen!

Solltest Du auf JsonToAhk() von @teadrinker umsteigen, muss noch nachgebessert werden.

User avatar
google
Posts: 34
Joined: 16 Nov 2022, 17:19

Re: Wie kann ich eine JSON-Datei rekursiv in AutoHotkey durchlaufen?

Post by google » 01 May 2024, 16:15

Solltest Du auf JsonToAhk() von @teadrinker umsteigen, muss noch nachgebessert werden.
Hallo @just me

Ich bin mir nicht sicher, welche Vorteile die Funktion von "teadrinker" im Vergleich zur Funktion von "cocobelgica" bietet. Ich habe gerade meine JSON-Datei mit beiden Funktionen mithilfe deiner rekursiven Funktion getestet, und die Ergebnisse sind identisch.

just me
Posts: 9763
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Wie kann ich eine JSON-Datei rekursiv in AutoHotkey durchlaufen?

Post by just me » 02 May 2024, 01:24

Moin,

der Vorteil besteht für mich darin, dass teadrinker das eigentliche Parsen des JSON-Strings der dafür vorgesehenen JavaScript-Engine des IE überlässt. Das ist zugleich auch der Nachteil. Microsoft kann diese Möglichkeit jederzeit in einer neuen Systemversion abschalten.

cocobelgica versucht dagegen, die JSON-Strukturen allein mit AHK Bordmitteln aufzubröseln. Dafür muss man darauf vertrauen, dass er alle erdenklichen Syntaxkombinationen kennt und korrekt auswertet.

teadrinkers Version ist zudem 'v2-affiner' und unterscheidet zwischen den AHK Objekttypen Array und Map (standard) bzw. Array und Object, soll heißen: JSON-Arrays werden zu AHK-Arrays, die überigen Objekte je nach Einstellung entweder zu Maps (standard) oder zu Objekten. Beim Parsen ist die Syntax für Maps anders als die für Objekte.

User avatar
google
Posts: 34
Joined: 16 Nov 2022, 17:19

Re: Wie kann ich eine JSON-Datei rekursiv in AutoHotkey durchlaufen?

Post by google » 02 May 2024, 16:03

Hallo Just me, danke für all die nützlichen Informationen. Nur aus reiner Neugier, wie würde die Syntax für Maps aussehen?

just me
Posts: 9763
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Wie kann ich eine JSON-Datei rekursiv in AutoHotkey durchlaufen?

Post by just me » 03 May 2024, 01:44

Moin,

die Syntax für Maps entspricht der vorhandenen. Wenn Du allerdings mit

Code: Select all

JsonToAhk(json, objIsMap := false, _rec)
'reine' Objekte erstellen lässt, brauchst Du zum Parsen:

Code: Select all

For Key In Obj.OwnProps {
   Value := Obj.%Key%
   ...
}
Außerdem muss man bei Arrays (If Type(Obj) = "Array") beachten, dass das erste Element von JSON-Arrays den Index 0 hat. Vom ermittelten AHK-Index muss man deshalb eigentlich 1 abziehen.

Post Reply

Return to “Ich brauche Hilfe”