• Eine weitere Frage wäre, kennt einer eine Möglichkeit die Objekte zu zählen?

    Du kannst dafür .Count verwenden.

  • Gibt es eine Möglichkeit das ich beispielsweise nur ein _JSON_Get($o_Object, ".card") mache und dann alle Objekte ausgelesen bekomme?

    Das wäre dann soetwas wie XPath für XML oder CSS-Selektoren für HTML. Für JSON ist mir ein entsprechender Selector erstmal nicht bekannt.
    Aber prinzipiell kein Problem soetwas umzusetzen. Hab sowas auch schonmal für meinen XML-Parser gebastelt.

    Wird aber eine Zeit dauern bis ich wieder dazu komme - ist aber auf meiner Liste.

    Gerne kann das aber natürlich jeder der möchte auch implementieren.

    Bzw, kann ich, auch zu debug zwecken, mir den Inhalt dieser Objekte ($o_Object) in der Console, oder in ein Label ausgeben lassen?

    Klar:

    AutoIt
    ConsoleWrite("$o_Object: " & _JSON_Generate($o_Object) & @CRLF)

    Du kannst dafür .Count verwenden.

    Kleine Einschränkung: Geht natürlich nur wenn die jeweilige Rückgabe ein Dictionary ist (in JSON-Sprech: ein "Objekt").
    Wenn ds sich aber um ein Array, String, Zahl oder Schlüsselwort handelt wird ".Count" einen Fehler werfen.
    Also vorher checken ob es ein Dictionary oder ein Array ist und dann jeweils entweder mit .Count oder Ubound arbeiten.

    Einmal editiert, zuletzt von AspirinJunkie (10. Juni 2018 um 13:01)

  • Perfekt das klappt so wunderbar, damit kann ich weiter machen. :)

    Vielen Dank hierfür.


    ".Count" kann ich gut gebrauchen.

    _JSON_Generate($o_Object) geht auch wunderbar wie ich mir das vorstelle.

    Jetzt bräuchte ich nur noch bei einem Hilfe.

    Das wäre dann soetwas wie XPath für XML oder CSS-Selektoren für HTML. Für JSON ist mir ein entsprechender Selector erstmal nicht bekannt.
    Aber prinzipiell kein Problem soetwas umzusetzen. Hab sowas auch schonmal für meinen XML-Parser gebastelt.

    Wird aber eine Zeit dauern bis ich wieder dazu komme - ist aber auf meiner Liste.[...]

    Wie ihr beide meintet, bekomme ich ja mit ".Count", oder Ubound die größe zurück.

    Damit würde ich gerne über eine Schleife mein "_JSON_Get($o_Object, "card")" durchgehen und alle Karten die existieren in ein Array laden.

    So das in dem Array nur noch die gefundenen Karten stehen (also in dem Beispiel sollte der Inhalt dann "[0] = 202, [1] = 208" sein.

    Anschließend kann ich mit einer weiteren Schleife, die das Array wiederum durchgeht die einzelnen Unterpunkte der Karten auslesen (also beispielsweise card.xxx.state - "xxx" ersetzt durch den Array Inhalt bei der Schleife).

    Meine Frage hier wäre, könntet ihr mir bitte ein Beispiel geben, wie ich die einzelnen Karten Namen in dieses Array bekommen könnte?

    Ich hab ab heute Urlaub für paar Tage, da kann ich wieder etwas basteln. :D

  • Meine Frage hier wäre, könntet ihr mir bitte ein Beispiel geben, wie ich die einzelnen Karten Namen in dieses Array bekommen könnte?

    Die kriegst du indem du das Objekt mit dem .Keys Attribut ansprichst.

  • Ja perfekt, genau so hatte ich mir das Vorgestellt. :D

    Dann Danke ich euch Beiden nochmal vielmals. :) :thumbup:

    //€dit: Gibt es in der AutoIT Hilfe etwas bzgl. der Attribute bei Objekten/Dictionaries?

    Also im Grunde suche ich weitere Infos zu ".Count" ".Keys" , etc., dann würde ich mich da gerne tiefer einlesen.

    Auf die schnelle hab ich in der AutoIT Hilfe nichts gefunden, bzw wohl eher falsch gesucht.

    Einmal editiert, zuletzt von borsTiHD (11. Juni 2018 um 12:28)

  • //€dit: Gibt es in der AutoIT Hilfe etwas bzgl. der Attribute bei Objekten/Dictionaries?

    Also im Grunde suche ich weitere Infos zu ".Count" ".Keys" , etc., dann würde ich mich da gerne tiefer einlesen.

    Auf die schnelle hab ich in der AutoIT Hilfe nichts gefunden, bzw wohl eher falsch gesucht.

    Hierzu findet man auch einiges im englischen Forum, z.B. :

    https://www.autoitscript.com/forum/topic/49…ject-in-autoit/

    Für ein grundlegendes Verständnis kann es zudem hilfreich sein, sich die Microsoft-Klassen mal anzuschauen.

    Keine große Hilfe - ich weiß ;)

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Sag das nicht, ist schonmal ein guter Ansatz für mich. :)

    Danke dir, da kann ich mich weiter einlesen.

    ----

    Ok, ich steh nochmal aufm Schlauch.

    Durch das ganze lesen und probieren hab ich schon Kopfschmerzen und bekomm es nicht hin.

    Hab auch keinen Durchblick mehr was ich jetzt schon alles probiert habe, deswegen habe ich mein kommendes Beispiel aufs nötigste reduziert.

    Mein neues Problem ist eine neue JSON Rückgabe in einem anderen Format.

    Wegen dem anderen Format schaffe ich es nicht die Items zu zählen. :/

    Bzw. durch alle Items mit einer Schleife durchzugehen.

    Könnt ihr mir dabei bitte nochmal helfen?

    Meine neue JSON Rückgabe ist in folgendem Beispielformat:

    Hier würde ich auch gerne wieder die Items zählen und in einer Schleife zusätzlich durchgehen.

    Einzeln ansprechen kann ich die mit "_JSON_Get($o_Object, "[1]")" (wie im kommenden Beispiel gezeigt), aber ich würde gerne alle Items zählen.

    Quasi sowas wie ein _JSON_Get($o_Object, "").

    Hier mein Beispiel:

  • Einfach das kombinieren was hier schon gesagt wurde:

  • Hi,

    ich finde deine JSON-UDF grundsätzlich super und habe sie auch schon bei mehreren Gelegenheiten (Parsing von Web-Services) verwendet. Ich bin jetzt aber auf einen JSON-String gestoßen, der (laut Augenschein und Internet) standardkonform ist, aber die UDF zum Abschmieren bringt. Ist auch nicht sonderlich komplex, scheint an dem Array zu liegen:


  • Was ist genau der Fehler?

    Folgendes Skript funktioniert bei mir mit deinem JSON-String so wie es soll:

    Code
    #include <JSON.au3>
    Global $s_String = ClipGet()
    
    $o_Object = _JSON_Parse($s_String)
    
    $s_data = _JSON_Get($o_Object, "variables[0].data")
    ConsoleWrite("data: " & $s_data & @CRLF)
  • Hi, ich hoffe ihr könnt mir helfen.

    Leider hatte ich mit JSON noch nie zu tun, daher stehe ich gerade auf dem Schlauch und würde mich freuen wenn mir jemand Gedankenanstöße bieten könnte wie ich nun zu jedem Datensatz die SKU und die dazu gehörige available_qty auslesen kann.

    In diesem Fall müßte also

    SPL-BKL-10 - 5
    ADVK-MANTARTA-BK - 10

    rauskommen.

    Hoffe ihr könnt mir helfen.

  • Die UDF ist genau, was ich gesucht habe, super :)!

    Gibt es eine Möglichkeit, eine Suche in großen JSON-Strings schneller durchzuführen? Sowohl die direkte Abfrage mit AutoIt, als auch JSON_Get brauchen bei 100.000 Zeichen ca 2,5 Sekunden für eine Abfrage.

    Wenn ich jetzt das ganze Objekt nach bestimmten Kriterien durchsuchen möchte und dann den "Pfad" dahin haben möchte, dann bin ich damit ganz schön lange unterwegs. :)

    Wenn ich ein Array durchsuche, geht das ja super schnell. Habe ich da eine Möglichkeit, die ich grade nicht sehe? :)

    *edit*

    Gibt es z. B. die Möglichkeit, das Objekt in bestimmter Tiefe einmal durch zu iterieren? Ich suche den Pfad zu einem bestimmten Type, oder alle Pfade zu einem bestimmten Type.

    Einmal editiert, zuletzt von Acanis (16. Dezember 2018 um 10:31)

  • Glare

    Bisschen lange her aber vielleicht hilft es noch.

    Der JSON-String den du gepostet hast ist ja nur ein Fragment und kann so direkt ja nicht verwendet werden.

    Etwas angepasst werden muss er noch damit man mit ihm arbeiten kann.

    Ansonsten zum Verständnis des Ansatzes: Die JSON-UDF macht lediglich aus JSON-Syntax verschachtelte AutoIt-Datenstrukturen.
    Aus Objekten z.B. macht sie ein Dictionary.
    Also muss man die Ausgabe entsprechend behandeln.

    Dann wäre folgendes ein Ansatz für deine Problematik:

    Zu der anderen Frage sage ich aus gegebenen Anlass nichts.

  • Hallo,

    ich hatte das Problem, das ich bei einem Array das Keyword "default" benutzen wollte. Die UDF behandelt aber nur "null".

    Beispiel:

    Ich habe dann in der UDF bei der Funktion _JSON_Generate noch folgendes eingefügt:

    Code
    Case IsKeyword($o_Object) = 1 ; Default
    $s_JSON_String &= "default"

    und bei der Funktion _JSON_Parse den String angepasst:

    Code
    $s_RE_G_KeyWord = '\G[\x20\r\n\t]*\b(null|default|true|false)\b', _

    Jetzt funktioniert mein Beispiel von oben auch ohne Probleme.

    Evtl. hilft das anderen oder du willst die Änderung in der UDF anpassen.

  • Evtl. hilft das anderen oder du willst die Änderung in der UDF anpassen.

    Es hilft sicherlich denjenigen die was ähnliches vorhaben wie du.


    Aufnehmen werde ich es aber nicht da der JSON-Standard kein "Default"-Keyword kennt.

    Jeder JSON-Validator würde einem daher den erzeugten JSON-String um die Ohren hauen.

    Daher also im Hinterkopf behalten, dass man diese Strings im Prinzip nur im eigenen Umfeld sicher einsetzen kann.

  • Danke für die Info.

    Ich kenne mich mit JSON nicht aus, und benutze die UDF bzw. nur Teile davon um bei einem TCP Client/Server die Pakete wieder in die richtigen Datentypen zu bringen. Also das ich einfach nur genau das senden kann was gerade ansteht (Array, String, Int, Bool, Binary usw.) und auf der anderen Seite es wieder genauso ankommt.

  • Genau für sowas ist das ja auch super geeignet.

    In der UDF hier hat es jedoch nichts zu suchen da diese erst einmal sich am Standard orientiert.

    Aber das schöne an Open Source ist ja das jeder sich das so anpassen kann wie er möchte.

  • Hi zusammen,

    ich brauche eure Hilfe.

    Ich habe warscheinlich ein ähnliches Problem wie 5yp3r ihn hatte.

    Allerdings ist es bei mir ein Key der ein Sonderzeichen im Namen beinhaltet, der zu Problemen führt.

    An der JSON Rückgabe kann ich nichts ändern, an deiner UDF würde ich gerne auch nichts ändern sofern ich drumherum komme.

    Ansonsten, schaut euch bitte folgendes Beispiel an:

    Das erwartete Ergebnis sollte 52 sein.

    Der erste Key (block.kategorie.Play+) wird nicht ausgewertet, bzw ausgelesen.

    Könnt ihr mir bitte weiterhelfen wie ich an den Wert komme?

    Das ganze muss dynamisch bleiben, da die einzelnen Keys sich ändern können.

    Gewollt ist, das ich zum Schluss sämtliche Values zusammengezählt habe.

    Vielen Dank schon mal. :)

  • Witziger Sonderfall mit einem "+" am Ende des Keys.

    War kein Problem von _JSON_Parse oder _JSON_Generate - die können damit umgehen.

    Nur _JSON_Get hatte damit Probleme.

    Hab es angepasst - neue Version hab ich hochgeladen.