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.

  • Und wieder: Nur mit "funktioniert nicht" kann hier keiner weiterhelfen.
    Minimum wäre das Skript mit dem es "nicht funktioniert" (auch hier fehlt es an einer Beschreibung wie genau sich dies äußert)

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