Json Datei prüfen und Werte anpassen

  • Hallo,

    Ich möchte eine Jsondatei prüfen und eventuelle Werte anpassen.

    in den Falle sind es die Parameter Port, QueryPort und MaxConnectedUsers

  • Das sind zu wenig Infos und eine Frage, welche man beantworten könnte ist auch nicht vorhanden.

    Was genau verstehst du unter "prüfen"?
    Ob die Datei Syntaxkonform mit dem JSON-Standard ist oder ob bestimmte Attribute bestimmte Werte (welche genau?) aufweisen?

  • Es gibt verschiedene UDFs die einem die Arbeit mit JSON in AutoIt erleichtern.
    Eine davon ist meine: JSON-UDF

    Mit dieser würde das ganze exemplarisch so aussehen:

    Btw: momentan bastelt er standardmäßig JSON-Objekte in Scripting.Dictionary-Objekte um.
    Da Maps ja mittlerweile so gut wie stable sind, werde ich wohl die UDF nochmal so anpassen, dass standardmäßig AutoIt-Maps verwendet werden.

  • Ein Problem hat sich noch herausgestellt.

    Bei einer Anwendung ist es Wichtig das alle Jsondateinen das Format UTF-16 LE besitzen, ansonsten können die Werte nicht gelesen werden.

    ist es möglich, alle Jsondateien in einen festen Ordner via Autoit Script auf dieses Format zu bringen?

  • Das Problem habe ich lösen können. Mit

    Code
          FileOpen($jsonconfig1, 2 + 32)
          FileWrite($jsonconfig1, _JSON_Generate($oJSON) & @CRLF)
          FileClose($jsonconfig1)

    Dann wurde ein weiteres Problem entdeckt, das einige Json Werte mit Zahlenwerten von Der Anwendung nicht übernommen wurden, weil diese in "" eingebettet waren. Das habe ich in der Json Klasse erst einmal mit einer digit Abfrage provosorisch behoben

  • Dann wurde ein weiteres Problem entdeckt, das einige Json Werte mit Zahlenwerten von Der Anwendung nicht übernommen wurden, weil diese in "" eingebettet waren.

    Waren diese Werte bereits in der Eingabedatei vom Datentyp String (also in Anführungszeichen gesetzt) oder geht es um Werte, welche du erst zugewiesen hast?

  • Hallo,

    lieber spät als nie. sobald die Werte geändert werden werden diese mit den "" versehen, auch wenn vorher keine "" vorhanden waren. Ich habe das Script so geschrieben die json nur angepasst wird wenn die Werte von den soll Werten abweichen.

    Kannst Du mir noch ein Beispiel geben wie ich jetzt werde in einem untergeordneten Array in einem Json anpassen. Z.b. unten nun zusätzlich Rcon - Port


    z.b.

  • sobald die Werte geändert werden werden diese mit den "" versehen, auch wenn vorher keine "" vorhanden waren.

    Dann enthält deine Änderung eine (implizite) Konvertierung in einen String. Also irgendeine Operation die aus dem vorherigen Zahlentyp eine Zeichenkette macht.

    Wenn du uns ein Beispiel deiner Änderung zeigtst können wir mehr sagen.

    Kannst Du mir noch ein Beispiel geben wie ich jetzt werde in einem untergeordneten Array in einem Json anpassen. Z.b. unten nun zusätzlich Rcon - Port

    Im Beispiel fehlt noch ein Komma hinter "StandardPvE".

    Zum besseren Verständnis was genau gemacht wird:

    • Die JSON-Datei wird in AutoIt-Datenstrukturen geparsed. Im Beispielfall wird die Variable $oJSON ein Dictionary (oder Map - je nach Einstellung) werden. Dieses hat Key-Value-Elemente. Als Value für den Key "Port" wird also ein Integer mit dem Wert 27015 eingetragen. Beim Key "RCON" wiederrum wird der Wert selbst wieder ein eigenes Dictionary/Map. Unter anderem mit dem Key "Password" mit dem dazugehörigen Wert "SecretPassword" als Stringtyp.
    • Dann passt man seine Werte innerhalb der AutoIt-Strukturen an. Man greift sich also erst das Dictionary, welches im Dictionary $oJSON unter dem Key "RCON" steht. In diesem Dictionary schnappt man sich den Wert der dort unter "Port" steht und ändert diesen.
    • Wir haben also Werte in der verschachtelten AutoIt-Datenstruktur verändert. Vom Grundaufbau ist dies immer noch genauso aufgebaut wie vorher - nur ein Wert wurde geändert. Diese AutoIt-Struktur können wir mit der Funktion _JSON_Generate dann in einen String konvertieren (man sagt "serialisieren" hierzu) welcher die Datenstruktur im Format JSON abbildet.

    Also was wichtig ist: JSON spielt nur eine Rolle beim Einlesen der Daten und am Ende beim wieder ausgeben. Alles was dazwischen passiert sind reine AutoIt-Typen und entsprechend müssen sie auch behandelt werden.
    Um nun also z.B. deinen Port im Subobjekt "RCON" zu ändern könnte man dies folgendermaßen durchführen:

  • das mit den "" scheint daran zu liegen das die Werte via Launchparameter übergeben werden. Ist aber nicht so tragisch.

    kann ich das Vorhandensein der 4 Werte prüfen, und bei Bedarf einfügen?

    Code
    $nPort = _JSON_Get($oJSON, "Port")
    $nQueryPort = _JSON_Get($oJSON, "QueryPort")
    $nMaxConnectedUsers = _JSON_Get($oJSON, "MaxConnectedUsers")
    
    $oJSON("RCON")("Port") = 27016
  • das mit den "" scheint daran zu liegen das die Werte via Launchparameter übergeben werden.

    Klar - dann sind es Strings und keine Zahlentypen.
    Musst also noch in einen Zahlentyp per Number() konvertieren.

    kann ich das Vorhandensein der 4 Werte prüfen, und bei Bedarf einfügen?

    Wenn du mit _JSON_Get arbeitest, dann gibt diese im Falle der Nichtexistenz einen Leerstring zurück und setzt @error auf 3.

    Im konkreten Fall hast du jedoch das Dictionary bereits in $oJSON vorliegen. Daher sollte hier auch ein $oJSON.Exists("Port") reichen. Bzw. ein MapExists wenn du Maps einsetzt.

  • Hallo,


    ich hole diesen Beitrag noch einmal hervor, da ich hier bei einer config verzweifel:

    Ich möchte die Werte

    gameport

    und

    max number of participants


    auslesen und bei Bedarf anpassen


    Danke

    2 Mal editiert, zuletzt von schlawiner (5. Juli 2025 um 20:16)

  • Die letzten beiden Zeilen machen den String übrigens invalid. Das stört den Parser hier zwar nicht aber grundsätzlich ist der gezeigte String nicht JSON-konform.

    Ansonsten musst du hier darauf achten dass die Elemente unter den Keys immer Arrays mit nur einem Element sind - daher immer das [0].

  • Hi schlawiner 👋 ,

    das Beispiel von AspirinJunkie wird sicher wunderbar funktionieren, doch da du nicht konkret gesagt hast, dass du AutoIt nutzen musst/willst, hier mal ein Beispiel mit jq welches du per cmd.exe oder bash oder zsh etc. aufrufen kannst.

    Aufruf über cmd.exe:

    Batch
    jq.exe ".\"net server config\"[0].\"game port\", .\"game server config\"[0].\"default event\"[0].rules[0].\"max number of participants\"" C:\examples\demo-config.json

    Aufruf über bash:

    Bash
    jq '."net server config"[0]."game port", ."game server config"[0]."default event"[0].rules[0]."max number of participants"' C:/examples/demo-config.json

    Voraussetzungen:

    • du musst als jq.exe haben oder herunterladen
    • du musst meinen Beispielpfad anpassen (für deine config.json oder wie sie auch immer heißen mag)

    Hinweise:

    • Es gibt auch eine AutoIt UDF (library) im engl. Forum, für jq. Ich selbst finde AspirinJunkies json.au3 super, doch ich verwende AutoIt nicht mehr viel, daher die allgemeine Library Empfehlung.
    • Deine JSON entspricht nicht gerade einem empfohlenen JSON Stil. Also Leerzeichen in den JSON nodes (keys) sind super unüblich und machen verlangen daher Anführungszeichen, die du vermeiden könntest.
      • JSON üblich ist entweder kebab-case oder camelCase
    • die letzten beiden Zeichen, Zeile 47 + 48 sind ungültig, wie oben bereits erwähnt

    Viele Grüße
    Sven

  • Leerzeichen in den JSON nodes (keys) [...] verlangen daher Anführungszeichen

    Mal abgesehen davon, dass ich nicht davon ausgehe, dass er die JSON-Datei selbst so konzipiert hat und daher einfach mit dem zu leben ist was man vorliegen hat:
    Das ist keine Notwendigkeit sondern eine Eigenart der Implementierung des Parsers.
    Bei jq ist es so - woanders ist es egal (siehe meine Implementierung oben).
    Einfacher zu arbeiten ist es aber ohne Leerzeichen - keine Frage (und ja mir ist außer meinem eigenen Selektor kein anderer bekannt der Leerzeichen als normale Zeichen behandelt).

    JSON üblich ist entweder kebab-case oder camelCase

    Ich kann mir nicht vorstellen, dass irgendwelche größeren Styleguides kebab-case empfehlen.
    Damit zerstört man sich ja auf einen Schlag die dot-notation in den Programmiersprachen (wie auch in AutoIt-Maps) da der Bindestrich dann als Minus-Operator interpretiert wird.
    Kurzer Blick bei Microsoft, Google, Schema.org und JSON:API ergibt daher auch durchgängig camelCase als Empfehlung.
    Und da JSON ursprünglich als Serialisierungsformat für Javascript entstanden ist ("JSON"="JavaScript Object Notation"), wo camelCase dominiert, kann ich mir nicht vorstellen, dass irgendjemand ernsthaft für JSON einen Styleguide kreiert, welcher die dot-notation von Javascript killt.

    Wenn man JSON primär als Serialisierungsformat betrachtet, dann könnte man im Python-Umfeld noch snake_case begründen, da dies dort die hauptsächliche naming convention ist (siehe PEP 8).
    Aber kebap-case als Empfehlung ist mir noch nie über den Weg gelaufen und ist auch begründbar unclever.

    Einmal editiert, zuletzt von AspirinJunkie (7. Juli 2025 um 07:56)