• Sorry für die späte antwort, konnte erst jetzt wirklich nachschauen.

    Hab es gerade getestet und funktioniert auf dem ersten Blick einwandfrei. ;)

    Ich danke dir vielmals für die (vorallem) schnelle Hilfe. ^^

    Mach weiter so.

  • Hallo!

    Ich scheitere an den JSON Files, egal was ich mache;( und bin schon etwas verzweifelt. Kurz zur Umgebenung: Ich lade per InetRead ein Json-File via REST-API von einem IPAM Server herunter. So weit so gut. Es wird mir auch korrekt im z.B.: Browser angezeigt. Für alle die nicht wissen was ein ipam ist: Ein DHCP/DNS/Netzwerkmanagment Verwaltung.

    Jetzt möchte ich aus den Output z.B. alle IPAdressen Aliasnamen und ganz wichtig den REF String herausgebkommen.

    Für meine "Gehversuch" habe ich ein Script hier aus dem Forum genommen und versucht diese zu verwenden. Es endet aber immer damit das ich nur einen Fehler bekomme:

    "D:\Doc\Autoit\test_ipam.au3" (64) : ==> Variable must be of type "Object".:

    Local $aCards[$vTmp.Count]

    Local $aCards[$vTmp^ ERROR

    Info: Den Output aus dem Json-File habe ich alle @LG und " " entfernt. Ebenso die Klammern [ und ] am Anfang und am Ende. Da es bei keinen der Script hier vorgekommen ist, denke ich das gehört nicht dazu. Der Rest ist ein der Variable als "Input" zusammen gestellt!

    Testscript:

    Ich hoffe ihr könnt mir helfen!

    lg

    Racer

  • Hat nichts mit der JSON-UDF zu tun.

    $vTmp erhält korrekterweise als Inhalt den String(!) "record:host/ZG5zLmhvc3QkLl9kZWZhdWx0LmF0Lmd2Lm1hZ3dpZW4ub3NkLm5iMzU2ODAx:nb12345.meins.at/default".

    Es ist also kein Objekt und hat daher auch kein Attribut namens "Count".

  • Hallo AspirinJunkie!

    Danke für Deine Antwort, aber ich steh voll am Schlauch:S

    Wenn ich den Ursprünglichen String nehme:

    $sJSONTest = '{"_curlState": "200","_mtstatus": "ok","stuff": {"link": "x1","state": "ok"},"card": {"202": {"admin": "a5","state": "ok"}, "208": {"admin": "a5","state": "ok"}}}'

    wird bei $vTmp = _JSON_Get($oObject, ".card") genommen und im _arraydisplay am Ende wird 202 und 208 angezeigt.

    Wie gesagt, das Beispiel funktioniert.

    Passen meine Daten nicht? Oder besser gesagt, wie bekomme ich das mit meinen json-Daten das zum fliegen.

    lg

    Racer

  • card ist in dem Beispiel ja auch ein Objekt - im Gegensatz zu _ref, welches ein String darstellt.

    Zumindest sind diese so in JSON-Syntax aufgebaut.


    Die UDF überführt als Objekte ausgewiesene Attribute in ein Scripting.Dictionary-Object.

    Dieses besitzt das Attribut .Count, welches die Anzahl der Elemente in der Dictionary-Struktur enthält.

    Passen meine Daten nicht? Oder besser gesagt, wie bekomme ich das mit meinen json-Daten das zum fliegen.

    Weiß ja keiner was du überhaupt machen willst?

    Irgendein kryptisches _ref-Attribut - aber was damit angestellt werden soll wissen wir ja nicht.

  • heißt das der "Fehler" kommt schon beim _JSON_Parse das der Inhalt des Übergabestring dann nicht so aufgearbeitet werden kann dass hinter ein Objekt erzeigt wird?

    Wie müsste mein String aussehen damit ich hier auch Objektdaten abfragen kann?

    Mache die die Abfrage in Browser kommt das hier heraus (leider muss ich viel schwärzen - Firmendaten)

    Der Output könnte aber auch einiges länger sein, je nachdem was ich für eine Abfrage stelle und dann kommen mehrer Objekte zusammen:

    Zusammengeklappt sieht das dann so aus:

    Das ist auch genau dass was ich mit Inetread einlese...

    Zur Frage des kryptischen _ref: Das ist ein Referenzcode (?) mit den ich in einer URL über die REST-API z.B. den Aliasnamen aus dem Infoblox (IPAM) löschen kann. Das muss ich auch zuerst machen, bevor ich den Host (wieder eine eigene _ref) entferne, sonst bleiben Datensätze "unsauber" zurück.

    lg

    Racer

  • heißt das der "Fehler" kommt schon beim _JSON_Parse das der Inhalt des Übergabestring dann nicht so aufgearbeitet werden kann dass hinter ein Objekt erzeigt wird?

    Nein - nix Fehler. Alles so wie es sein soll. _ref enthält ganz eindeutig einen String und kein Objekt.

    Auch in deinem Browser-Ausschnitt ist der Inhalt von _ref lediglich eine Zeichenkette (String/Text/Zeichenkette - alles das selbe)

    Wie kommst du also darauf, dass das Attribut _ref ein Objekt enthalten sollte?

    Wir wissen im übrigen immer noch nicht mehr was am Ende das Ziel sein soll und welche Infos du wie weiterverarbeiten willst.

    Du hast hier lediglich dargelegt wo die Daten herkommen und wie sie dort erscheinen. - war aber eigentlich gar nicht die Frage.

    Zusammengeklappt sieht das dann so aus:

    Vom _ref ist hier aber nix mehr zu sehen.

    Die einzelnen value-Elemente des list-(Arrays?) stellen Objekte dar und haben offensichtlich jeweils ein Attribut namens "_ref".

    Dieses ist vom Datenformat her ein String.

  • Nein - nix Fehler. Alles so wie es sein soll. _ref enthält ganz eindeutig einen String und kein Objekt.

    Auch in deinem Browser-Ausschnitt ist der Inhalt von _ref lediglich eine Zeichenkette (String/Text/Zeichenkette - alles das selbe)

    wenn es geht, was muss ich machen damit ich diese _ref bzw. andere Stringe (ipadresse,..) herausbekomme? oder geht das gar nicht so? Oder ist die UDF von Dir hier für mich das falsche Werkzeug?

    Wir wissen im übrigen immer noch nicht mehr was am Ende das Ziel sein soll und welche Infos du wie weiterverarbeiten willst.

    Du hast hier lediglich dargelegt wo die Daten herkommen und wie sie dort erscheinen. - war aber eigentlich gar nicht die Frage.

    Das ist ein Referenzcode mit der ich in einer URL über die REST-API z.B. den Aliasnamen aus dem Infoblox (IPAM) löschen kann. Das muss ich auch zuerst machen, bevor ich den Host (wieder eine eigene _ref) entferne, sonst bleiben Datensätze "unsauber" zurück. Das ist das Ziel.

    Ich möchte es aber auch zum Suchen von Computer verwenden. funktioniert so:

    1.) Abfrage über eine https-url mit einen Wildcard (...api/v2.2/record:host?_return_fields%2B=aliases&name~=nb1234)

    2.)Dann kommt eine lange Liste (das was ich Dir als zugeklapptes Bild gesendet habe) mit verschiedensten Angaben von Hosts (DHCP / IPv4addr / mac,..) nur pro Client ist das so ein Abschnitt <value type="object">...</value>

    3.)Wenn ein Client zum Löschen ausgewählt ist, muss zuerst der Alias via den _ref-Key per https-request entfernt werden und dann der Hosteintrag (der obere _reg-Key). Ist nicht schön, aber so ist es nunmal. siehe z.B.:hier

    Danke für Deine Geduld!

    lg

    Racer

  • wenn es geht, was muss ich machen damit ich diese _ref bzw. andere Stringe (ipadresse,..) herausbekomme?

    Die _ref hast du doch schon längst - die steht in deinem Beispiel ja nun in der Variable $vTmp.

    Die IP-Adresse (die einzige im Beispiel) geht z.B. so:

  • Hi.

    Ich muss leider auch mal was fragen, weil ich einfach nicht weiter komme... Ich nutze die UDF, um die .json Konfigurationsdatei eines externen Programms in meinem Programm einzulesen. Das funktioniert wunderbar. In meinem Programm, welches ein GUI hat, sollen jetzt aber auch Einstellungen für das externe Programm vorgenommen werden können. Das externe Programm hat kein GUI aber beide Programme arbeiten direkt zusammen. Deswegen sollen in meiner GUI auch die Einstellungen für das externe Programm (welches nicht in AutoIt geschrieben ist) mit vorgenommen werden.

    Also muss ich auch Werte zurück schreiben und somit die .json Datei neu erzeugen. Grundsätzlich funktioniert das auch. Nur bei "verschachtelten" Elementen, weiß ich einfach nicht, wie ich diese Elemente direkt ansprechen kann, um sie zu ändern.

    Code
        $fle_hwnd = FileOpen(@ScriptDir & "\nfo4HTPC.Settings.json")
    
        $j_String = FileRead($fle_hwnd)
    
        FileClose($fle_hwnd)

    Damit wird die .json Datei eingelesen

    Dann erzeuge ich per

    Code
        $j_Object = _JSON_Parse($j_String)

    eine Datenstruktur, aus der ich die einzelnen Elemente/Werte auslesen kann.

    Code
        Global $json_MinimumDiscSpace = _JSON_Get($j_Object, "MinimumDiscSpace")
        Global $json_Ignore_nfo_IDs = _JSON_Get($j_Object, "Ignore_nfo_IDs")
    ...
        Global $json_Image_Movie_Poster = _JSON_Get($j_Object, "Movies.Image_Poster"
    ...

    Das klappt alles einwandfrei. Wie man sieht, gibt es sowohl "einfache" Elemente wie "MinimumDiscSpace" als auch "verschachtelte" wie "Movies.Image_Poster". Wie gesagt, alles kein Problem.

    Das Ganze bereitet erst dann Probleme, wenn ich die Werte wieder zurück schreiben will.

    Ich kann leicht einen neuen Wert für "MinimumDiscSpace" zuweisen:

    Code
    $j_Object("MinimumDiscSpace") = GUICtrlRead($input_94_01)

    und dann die .json Datei neu generieren, mit den geänderten Werten...

    Code
        $file = FileOpen(@ScriptDir & "\nfo4HTPC.Settings.json", 2)
    
        FileWrite($file, _JSON_Generate($j_Object))
    
        FileClose($file)

    Nur bei den "verschachtelten" Elementen, da habe ich einfach keinen Durchblick. Wenn ich

    Code
    $j_Object("Movies.Image_Poster") = "true"

    versuche, wir ans Ende der .json Datei eine Zeile angehängt mit

    Zitat


    "Movies.Image_Poster": "true"

    statt, wie ich eigentlich erreichen will das Element

    Zitat

    "Movies": {

    "Image_Poster": false,

    ...

    },

    auf

    Zitat

    "Movies": {

    "Image_Poster": true,

    ...

    },

    zu ändern.

    Wie bitte muss ich

    Code
    $j_Object("Movies.Image_Poster") = "true"

    formatieren, damit das gewünschte Ziel erreicht wird.

    Ich muss gestehen, vor dieser Anwendung der JSON_UDF habe ich noch nie etwas mit Datenstrukturen bzw Dictionary zu tun gehabt. Ich bin bisher immer mit Variablen und Arrays ausgekommen...

    Vielen Dank schon mal für eure Antworten und eure Zeit.

  • Du hast schon Recht. Die JSON_Get-Funktion hab ich ja eigentlich nur geschrieben weil eben der Direktzugriff über AutoIt bei den verschachtelten Strukturen ziemlich furchtbar werden kann.

    Da wäre es nur konsequent gewesen auch ein entsprechendes _JSON_Set als Pendant hierfür zum Schreiben hinzuzufügen.

    Aber sei es drum - bis dahin müssen wir uns halt erstmal mit dem Direktzugriff von AutoIt aus begnügen.

    Für deinen Fall z.B. so:

    Code
        $fle_hwnd = FileOpen(@ScriptDir & "\nfo4HTPC.Settings.json")
    
        $j_String = FileRead($fle_hwnd)
    
        FileClose($fle_hwnd)
    Code
        $file = FileOpen(@ScriptDir & "\nfo4HTPC.Settings.json", 2)
        
        FileWrite($file, _JSON_Generate($j_Object))
    
        FileClose($file)

    Wenn du eine komplette Datei in einem Rutsch lesen oder schreiben möchtest, dann brauchst du kein FileOpen/FileClose sondern kannst direkt den Dateinamen verwenden.

    Ein FileOpen/Close wird von der Funktion ja implizit schon selbst durchgeführt.

    In deinem Fall also:

    AutoIt
    $j_String = FileRead(@ScriptDir & "\nfo4HTPC.Settings.json")

    bzw.

    AutoIt
    FileWrite(@ScriptDir & "\nfo4HTPC.Settings.json", _JSON_Generate($j_Object))
  • $o_JSON.Item("Movies").Item("Image_Poster") = False

    Genau das hat mir gefehlt, vielen Dank. Damit müsste ich ohne weiteres klar kommen. Werde ich gleich mal ausprobieren.

    Auch die anderen Tips werde ich mir zu Herzen nehmen. Spart ein paar Zeilen Code. Irgendwo habe ich irgendwann mal gelesen, man sollte besser immer mit FileOpen / FileClose arbeiten, weil das sicherer und schneller wäre. Das ist aber schon lange her und ich weiß auch nicht mehr in welchem Zusammenhang das da erwähnt wurde. Deswegen mache ich das eigentlich immer so, einfach aus Gewohnheit.

    Ich werde mich noch mal melden, um zu Berichten, ob es jetzt auch bei mir funktioniert.

    Noch mal Danke.

  • Moin AspirinJunkie ,

    bei diesem Script wird ein 'krummes' Zeichen ausgegeben... könntest du bitte mal schauen, ob du den Fehler findest - danke!

  • Also, dass die Umlaute nicht korrekt dargestellt werden liegt an deinem _WinAPI_WideCharToMultiByte.

    Das fehlende & hingegen ist tatsächlich ein Bug.

    Die Unicode-Escapes \uxxxx wurden hier nicht korrekt konvertiert, da sie als Dezimalzahlen statt Hex interpretiert wurden.

    Hab die UDF korrigiert und neu hochgeladen.

  • Gefällt es dir so besser: Du hast es auf ANSI, ich aber auf UTF-8 umgestellt, weil ich damit besser leben kann. Der Nachteil dabei ist, dass sich ANSI und UTF-8 nicht sonderlich gut vertragen. ;)

  • Hallo.

    Zuerst mal Danke für diese UDF, ohne die einige meiner Projekte erst gar nicht möglich wären.

    Nachdem ich diese UDF schon eine Weile erfolgreich im Einsatz habe, ist mir nun ein Problem mit _JSON_Parse unter gekommen.

    Im Moment baue ich den Musik- Part in mein Programm "Media-Buddy" ein. Dabei werden Metadaten für Interpreten von https://theaudiodb.com/ mit Hilfe deren API herunter geladen. Die Daten liegen (natürlich, sonst würde das hier ja nicht passen) im .json Format vor. Meistens funktioniert das Ganze einwandfrei. Aber manchmal stürzt AutoIt dabei ab,

    Es scheint, das es einen Puffer- Überlauf gibt, wenn ich die Google Suche nach "rc:-1073741571" richtig interpretiert habe. Wirklich schlau bin ich daraus aber nicht geworden.

    Was ich mir vorstellen kann, ist die massive Häufung von Unicode Steuerzeichen in der .json Datei, da sie einen langen Text (die Biographie der Band) sowohl auf Japanisch als auch auf hebräisch enthält, worin es ja (fast) keine "normalen" ASCII Zeichen gibt. Ich habe die entsprechende .json Datei mal angehängt. Eigentlich sogar zwei mal, denn die Original- Datei aus der Online- Datenbank besteht aus einer einzigen, etwa 80.000 Zeichen langen, Zeile. Ich habe dann, um mehr Übersicht zu haben, entsprechend diverse CR hinzugefügt, um die einzelnen Elemente besser auseinander halten zu können.

    Bei meinem Test- Pool hat es dieses Problem erst mal nur mit "Aerosmith" gegeben. Alle anderen Interpreten, mit denen ich getestet habe, haben solche Probleme nicht verursacht. Wenn ich aber z.B. Beatles, Michael Jackson, Led Zeppelin oder ähnliches teste, kommt es zu denselben Problemen wie bei Aerosmith, da dann ebenfalls eine Biographie auf Japanisch und/oder hebräisch vorhanden ist..

    Für den Fall, das es von Interesse ist, hier ist ein direkter Link zur API:

    https://www.theaudiodb.com/api/v1/json/1/…php?s=Aerosmith

    Man muss am Ende jeweils nur den Namen der Band, des Interpreten austauschen, um entsprechende Daten zu bekommen...

    Zum reproduzieren des Fehlers einfach die angehängte (oder eine selbst von TheAudioDB herunter geladene) .json Datei mit folgenden Befehlen einlesen und dann parsen:

    $String = FileRead("Artist.json")

    $Object = _JSON_Parse($String)

    Dabei kommt es dann jedes Mal zum Crash, sofern die Biographie auf Japanisch und/oder hebräisch vorhanden ist. Falls nicht, läuft es einwandfrei...

    Das Problem liegt definitiv an der UDF, weswegen ich selbst nicht wirklich etwas daran ändern kann. Dafür verstehe ich zu wenig von der ganzen Geschichte. Falls sich das Problem hier nicht abstellen lässt, muss ich irgendwie die japanische und hebräische Beschreibung aus der. json entfernen, bevor ich sie parse... Das wäre aber nur ein unschöner Workaround, kein Fix...

    Hier ist noch die komplette Ausgabe während so einem Versuch: