XProfan X4 mit JSON-Unterstützung

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Information: Wir verlosen 3 x das Buch "Nur noch dieses Level!" Spiel mit!

    • XProfan X4 mit JSON-Unterstützung

      XProfan X4 unterstützt das Datenaustausch-Format JSON!

      Wem der Begriff JSON nichts sagt, der bemühe bitte eine Suchmaschin seiner Wahl. (In der XProfan-Hilfe werde ich JSON natürlich kurz erklären.)
      Für den Rest hier eine kurze Übersich der Funktionen:

      Es bedeuten in der Syntax:
      js: Integer - Handle zu einem Json-Objekt oder einer JSon-Liste
      filename: string - Dateiname (ggf. mit Pfad)
      json: string - Ein Json-Objekt als String
      name: string - Name eines Json-Attributes (mögliche Attribute: String, Number, Boolean, Null, Object oder List)
      string: string - beliebiger String-Wert
      wert: integer/double - beliebiger numerischer Wert
      obj - integer: Integer - Handle zu einem Json-Objekt
      lst - integer: Handle zu einer Json-Liste

      js = Create("JSON"[, filename])
      Ohne filename wird ein leeres Json-Objekt angelegt, mit filename wird das Objekt aus der Datei, die ein Json-Objekrt als String entrhalten muss, eingelesen.

      json = Json("TEXT", js, mode)
      Das Json-Objekt js wird als Json-Sting ausgegegeben. Mode 0: als eine Zeile / mode 1: in besser lesbarer Form

      Json("ADDSTRING", js, [name,] string)
      Dem Objekt oder der List js wird ein String als Attribut hinzugefügt. Im Falle einer Liste wird kein Attributsname benötigt.

      Json("ADDNUMBER", js, [name,] wert)
      Dem Objekt oder der List js wird ein numerischer Wert als Attribut hinzugefügt. Im Falle einer Liste wird kein Attributsname benötigt.

      Json("ADDBOOL", js, [name,] wert)
      Dem Objekt oder der List js wird ein boolscher Wert als Attribut hinzugefügt. Im Falle einer Liste wird kein Attributsname benötigt. Da XProfan keinen passenden Datentyp kennt steht der Wert 0 für false und 1 für true.

      Json("ADDOBJECT", js, [name,] obj)
      Dem Objekt oder der List js wird ein Json-Objekt als Attribut hinzugefügt. Im Falle einer Liste wird kein Attributsname benötigt.

      Json("ADDLIST", js, name, lst)
      Dem Objekt js wird eine JSon-Liste hinzugefügt. Einer Liste kann keine Liste als direktes Child hinzugefügt werden.

      string = Json("GETSTRING", js, [name|idx])
      Ein String wird aus dem Objekt oder der Liste js gelesen. Beim Objekt wird der Attributsname benötigt, bei der Liste der Index in der Liste.

      wert = Json("GETNUMBER", js, [name|idx])
      Ein numerischer Wert wird aus dem Objekt oder der Liste js gelesen. Beim Objekt wird der Attributsname benötigt, bei der Liste der Index in der Liste.

      integer = Json("GETBOOL", js, [name|idx])
      Ein boolscher Wert wird aus dem Objekt oder der Liste js gelesen. Beim Objekt wird der Attributsname benötigt, bei der Liste der Index in der Liste. Das Ergebnis ist 0 oder 1.

      js = Json("GETOBJECT", js, [name|idx])
      Ein Objekt wird aus dem Objekt oder der Liste js gelesen. Beim Objekt wird der Attributsname benötigt, bei der Liste der Index in der Liste.

      js = Json("GETLIST", js, name)
      Ein Liste wird aus dem Objekt js gelesen.

      js = Json("NEWLIST", name)
      Eine leere JSon-Liste wird erzeugt.

      Json("WRITE", js, filename)
      Das Json-Objekt js wird als Json-Sting in eine Datei geschrieben. Ideal für den Datenaustausch mit anderen Programmen.

      integer = Json("COUNT", js)
      Die Anzahl der Elemente bzw. Attribute einer Liste oder eines Objektes wird ausgegeben.

      text = Json("ENUM", js)
      Das komplette Json-Objekt js wird in eine Textzeile geschriebeb bzw. Zeile für Zeile (Attribut für Attribut/Element für Element) in die Listboxliste geschrieben.
      Bei der Textzeile sind die einzelnen Attribute/Elemente durch ein ";" getrennt.
      Eine Zeile beginnt, je nach Verschatelungstiefe mit mehreren Leerzeichen (zwei pro Ebene) und einer Ziffer für den Typ des Attributs/Ements gefolgt von einem "|". Dann folgen Name/Index und Wert, getrennt durch einen ":".
      Bei den Typen bedeuten: 1=Number/2=String/3=Boolean/4=null/5=Liste/6=Objekt. Bei einer Liste steht als Wert ihr Handle in eckiger Klammer, bei einem Objekt sein Wert in geschweifter Klammer.

      Das soll fürs Erste genügen.

      FROHE OSTERN!

      Roland
      Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD / ATI Radeon HD4770 512 MB / Windows 7(32) - XProfan X3
      AMD Athlon II X2 2,9 GHz / 3 GB RAM / 500 GB HDD / ATI Radeon 3000 (onboard) / Windows 10(64) - XProfan X3


      http://www.xprofan.de
    • aus: Wikipedia - JSON
      Array beginnt mit [ und endet mit ]. Es enthält eine durch Kommata geteilte, geordnete Liste von Werten gleichen oder verschiedenen Typs. Leere Arrays sind zulässig.

      Objekt beginnt mit { und endet mit }. Es enthält eine durch Kommata geteilte, ungeordnete Liste von Eigenschaften. Objekte ohne Eigenschaften („leere Objekte“) sind zulässig.


      Das Array (auch Liste genannt) wird dort als geordnet bezeichnet. Im Beispiel ist die Liste aber ungeordnet.


      Ok, kontrolliert.

      In RFC-7159 wird über die Ordnung nichts gesagt und die Beispiele zeigen ungeordnete Listen.

      In ECMA-404 steht

      - 7 Arrays
      - The values areseparated by commas. The order of the values is significant.

      Das würde ich eher mit wichtig als mit geordnet übersetzen.

      P.S.:
      Habe es in Wikipedia zur Diskussion gestellt.
      Programmieren, das spannendste Detektivspiel der Welt.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Michael Wodrich ()

    • Ups, ich kann Objekte, Listen und Strings erzeugen und lesen.

      Aber muss ich sie beim Änderungswunsch jedesmal neu erzeugen?

      Im Standard ist ja definiert, das von mehreren gleichen Einträgen immer nur der letzte Wert genommen wird.
      Aber eine direkte Änderung wäre natürlich besser.

      Also ein CHANGE und DELETE wäre gut.
      Programmieren, das spannendste Detektivspiel der Welt.
    • Und ENUM funktioniert auch nicht mit allen JSON einwandfrei.

      Beispiel:

      Quellcode: test5.json

      1. {
      2. "id": "0001",
      3. "type": "donut",
      4. "name": "Cake",
      5. "ppu": 0.55,
      6. "batters":
      7. {
      8. "batter":
      9. [
      10. { "id": "1001", "type": "Regular" },
      11. { "id": "1002", "type": "Chocolate" },
      12. { "id": "1003", "type": "Blueberry" },
      13. { "id": "1004", "type": "Devil's Food" }
      14. ]
      15. },
      16. "topping":
      17. [
      18. { "id": "5001", "type": "None" },
      19. { "id": "5002", "type": "Glazed" },
      20. { "id": "5005", "type": "Sugar" },
      21. { "id": "5007", "type": "Powdered Sugar" },
      22. { "id": "5006", "type": "Chocolate with Sprinkles" },
      23. { "id": "5003", "type": "Chocolate" },
      24. { "id": "5004", "type": "Maple" }
      25. ]
      26. }
      Alles anzeigen
      Programmieren, das spannendste Detektivspiel der Welt.
    • Hab mal das ENUM zu ENUMLIST erweitert :

      Quellcode

      1. Declare Integer js[3], ls, xs
      2. window 640, 800
      3. js[0] = create("JSON")
      4. If js[0]
      5. json("AddString", js[0], "Name", "Bernd Müller")
      6. json("AddNumber", js[0], "Nummer", Rnd(100))
      7. json("AddString", js[0], "Ort", "Hamburg")
      8. ls = Json("NEWLIST")
      9. json("AddString", ls, "Golf")
      10. json("AddString", ls, "Tennis")
      11. json("AddString", ls, "Schwimmen")
      12. json("AddString", ls, "Tauchen")
      13. Json("AddList", js[0], "Hobbys", ls)
      14. EndIf
      15. js[1] = create("JSON")
      16. If js[1]
      17. json("AddString", js[1], "Name", "Ralf Zimmer")
      18. json("AddNumber", js[1], "Nummer", Rnd(100))
      19. json("AddString", js[1], "Ort", "Köln")
      20. ls = Json("NEWLIST")
      21. json("AddString", ls, "Reiten")
      22. json("AddString", ls, "Volleyball")
      23. json("AddString", ls, "Handball")
      24. Json("AddList", js[1], "Hobbys", ls)
      25. EndIf
      26. js[2] = create("JSON")
      27. If js[2]
      28. json("AddString", js[2], "Name", "Heike Schneider")
      29. json("AddNumber", js[2], "Nummer", Rnd(100))
      30. json("AddString", js[2], "Ort", "Berlin")
      31. ls = Json("NEWLIST")
      32. json("AddString", ls, "Bogenschießen")
      33. json("AddString", ls, "Gymnastik")
      34. json("AddString", ls, "Turnen")
      35. json("AddString", ls, "Wasserball")
      36. json("AddString", ls, "Badminton")
      37. Json("AddList", js[2], "Hobbys", ls)
      38. EndIf
      39. WhileLoop 0, 2
      40. Print Json("Text", js[&LOOP], 1)
      41. Print Json("EnumList", js[&LOOP], "Hobbys")
      42. Listbox$("Hobbys von : " + Json("GetString", js[&LOOP], "Name"), 2)
      43. EndWhile
      44. Print
      45. Print "Taste zum Beenden...."
      46. Waitkey
      47. SubProc Json.EnumList
      48. Parameters Int object, String Name
      49. Declare Int l, a
      50. l = Json("GetList", object, Name)
      51. a = Json("Count", l)
      52. ClearList
      53. WhileLoop 0, a - 1
      54. AddString(0, Json("GetString", l, &LOOP))
      55. EndWhile
      56. Return a
      57. EndProc
      58. End
      Alles anzeigen
      So kann man den Inhalt der Listboxliste zur weiteren Bearbeitung besser nutzen.

      Bei den Typen bin ich auch noch am überlegen. Da Print hauptsächlich zum Ausprobieren
      dient und später hauptsächlich mit z.B. Gridboxen bzw. MultiEdit für die Listen gearbeitet
      wird, bietet es sich ja an, die Move - Funktionen dahingehend zu erweitern. Um nicht alles
      von Hand zu Fuß zu machen, könnte ich mir ein

      Move("JsonToGridbox", ...) und umgekehrt

      vorstellen. Dabei müßte man einfach nur die numerischen bzw. bool Typen in Strings
      umwandeln. Die Attributnamen könnten dann ebenso als Spaltenüberschriften dienen.

      Weitere Ideen gibt es da bestimmt genug.
    • Die Sache mit dem "ENUM" war irgendwie nicht so richtig. Ich habe das "ENUM" daher wieder gestrichen. Viel eleganter kann man nun mit den neuen Funktionen VALUE, NAME und TYP etwa ein unbekanntes JSON-Objekt untersuchen:

      integer = Json("COUNT", js)
      Die Anzahl der Elemente bzw. Attribute einer Liste oder eines Objektes wird ausgegeben.

      string = Json("NAME", js, idx)
      Der Name des Elements mit dem Index idx. Der Index beginnt bei 0. Wenn das Objekt eine Liste ist, bei der die Elemente keine Namen haben, wird "[]" zurück gegeben.

      string = Json("VALUE", js, idx)
      Der Inhalt/Wert des Elements mit dem Index idx als String.

      typ = Json("TYP", js, idx)
      Der Typ des Elements mit dem Index idx als String. Typ ist ein Integer. Hier bedeuten: 1=Number/2=String/3=Boolean/4=null/5=Liste/6=Objekt.

      Mit folgende Zeilen läßt sich also ein Element untersuchen:

      Quellcode

      1. count = json("count", js)
      2. WhileLoop 0, count-1
      3. print json("name", js, &loop),"-",json("value", js, &loop),"-",json("typ", js, &loop)
      4. EndWhile

      Damit sollte die Json-Implementierung vorläufig abgeschlossen sein.

      Ach ja: zum Thema geordnete Liste: Ich nehme an, dass hier die Wortwahl etwa unglücklich ist und damit ausgedrückt wird, dass die Elemente hier nicht mit ihrem Namen aufgerufen werden, sondern eben in der Ordnung des Index mit ihrem Index. Und dieser entspricht der Reihenfolge der Hinzufügung. Da ja jedes Element einen anderen Datentyp haben kann, wäre eine Sortierung ja kaum möglich.

      Gruß
      Roland
      Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD / ATI Radeon HD4770 512 MB / Windows 7(32) - XProfan X3
      AMD Athlon II X2 2,9 GHz / 3 GB RAM / 500 GB HDD / ATI Radeon 3000 (onboard) / Windows 10(64) - XProfan X3


      http://www.xprofan.de
    • Volkmar schrieb:

      Das Zip-Archiv ist von heute, die EXE trägt aber wie die letzte Version den Zeitstempel 13.04.2017 23:40. Ist das OK?

      Gruß Volkmar
      Arrghh .... vergessen, das gepackte Archiv auch hochzuladen! Jetzt ist es aktuell!

      Gruß
      Roland

      BTW: Wenn man bei SQL-Befehlen im Modus 2 mit Set("SQLFile", ...) eine Datei mit der Endung ".json" angibt, wird das entsprechende Select-Ergebnis im Json-Format geschrieben, bei ".xml" im XML-Format.
      Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD / ATI Radeon HD4770 512 MB / Windows 7(32) - XProfan X3
      AMD Athlon II X2 2,9 GHz / 3 GB RAM / 500 GB HDD / ATI Radeon 3000 (onboard) / Windows 10(64) - XProfan X3


      http://www.xprofan.de
    • Mir sind jetzt keine Fehler aufgefallen.

      Hinweis: Beim Lesen aus einer Datei (CREATE) erwartet Json diese im UTF8-Format, ebenso wird diese bei WRITE in diesem Format geschrieben. Beim SQL-Export wird dies auch berücksichtigt. Innerhalb von XProfan wird das gewohnte ANSI-Format verwendet.

      Gruß
      Roland
      Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD / ATI Radeon HD4770 512 MB / Windows 7(32) - XProfan X3
      AMD Athlon II X2 2,9 GHz / 3 GB RAM / 500 GB HDD / ATI Radeon 3000 (onboard) / Windows 10(64) - XProfan X3


      http://www.xprofan.de
    • Hallo,
      ich möchte jetzt aber mehrere Personen in eine Datei speichern.
      Wie macht man das am besten ?
      Hier für eine Person :

      Quellcode

      1. Declare Integer js, ls, ds
      2. Window 640, 800
      3. js = create("JSON")
      4. If js
      5. json("AddString", js, "Name ", "Bernd Müller")
      6. json("AddNumber", js, "Nummer", 100)
      7. json("AddString", js, "Ort ", "Hamburg")
      8. ls = Json("NEWLIST")
      9. json("AddString", ls, "Golf")
      10. json("AddString", ls, "Tennis")
      11. json("AddString", ls, "Schwimmen")
      12. json("AddString", ls, "Tauchen")
      13. Json("AddList", js, "Hobbys", ls)
      14. EndIf
      15. Print Json("Text", js, 1)
      16. Json("Write", js, $AppdataDir + "Test.json")
      17. Print
      18. Print "Taste zum Einlesen..."
      19. WaitKey
      20. ds = Create("JSON", $AppdataDir + "Test.json")
      21. Print Json("Text", ds, 1)
      22. WaitKey
      23. End
      Alles anzeigen
      Wenn ich jetzt das Objekt js immer wieder mit neuen Daten befülle, müßte ich zuerst ein
      neues Objekt ds anlegen und anschließend immer mit Json("AddObject", ds, [name], js)
      den neuen Datensatz hinzufügen. Da müßte ich nochmals pro DS einen Namen geben.
      Ist die Dateneingabe dann fertig, wird mit Json("Write", ds, filename) geschrieben.

      Beim Wieder-Öffnen mit Json("Create", filename) hätte ich das gleiche Problem.
      Oder kann ich da mit Json("Count", ds) die Datensätze (Objekte) wieder zählen
      und nacheinander einlesen ?
    • Wenn Du mehrere Personen speichern willst, empfiehlt s ich eine Liste von Objekten. Also z.B. als oberste Ebene ein Objekt. Diesem Objekt fügst Du z.B. die Liste "Adressen" hinzu. Der Liste Adressen fügst Du nun mehrere Objekte hinzu, die z.B. Deinem oben generierten Objekt entsprechen.

      Gruß
      Roland
      Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD / ATI Radeon HD4770 512 MB / Windows 7(32) - XProfan X3
      AMD Athlon II X2 2,9 GHz / 3 GB RAM / 500 GB HDD / ATI Radeon 3000 (onboard) / Windows 10(64) - XProfan X3


      http://www.xprofan.de
    • Quellcode

      1. ' Wenn Du mehrere Personen speichern willst, empfiehlt sich eine Liste von Objekten.
      2. ' Also z.B. als oberste Ebene ein Objekt.
      3. ' Diesem Objekt fügst Du z.B. die Liste "Adressen" hinzu.
      4. ' Der Liste Adressen fügst Du nun mehrere Objekte hinzu,
      5. ' die z.B. Deinem oben generierten Objekt entsprechen. Gruß Roland
      6. ' also etwa so...
      7. Window 640, 800
      8. Declare long datenbank, datensaetze, satz, kontrolle_DB
      9. Proc NeuerDatensatz
      10. Parameters string Name, long Nr, string Ort, Hobbys[]
      11. Declare long obj, ls
      12. obj = Create("JSON")
      13. If obj
      14. json("AddString", obj, "Name", Name)
      15. json("AddNumber", obj, "Nummer", Nr)
      16. json("AddString", obj, "Ort", Ort)
      17. ls = Json("NEWLIST")
      18. WhileLoop 0, SizeOf(Hobbys[]) - 1
      19. json("AddString", ls, Hobbys[&loop])
      20. EndWhile
      21. Json("AddList", obj, "Hobbys", ls)
      22. EndIf
      23. Return obj
      24. EndProc
      25. datenbank = Create("JSON")
      26. if datenbank
      27. datensaetze = Json("NEWLIST")
      28. satz = NeuerDatensatz("Bernd Müller",100,"Hamburg",array(string "Golf","Tennis","Schwimmen","Tauchen"))
      29. Json("ADDOBJECT", datensaetze, satz)
      30. satz = NeuerDatensatz("Max Mustermann",42,"Lübeck",array(string "Reiten","Golfen","Lesen"))
      31. Json("ADDOBJECT", datensaetze, satz)
      32. Json("AddList", datenbank, "Adressen", datensaetze)
      33. endif
      34. Print Json("Text", datenbank, 1)
      35. Json("Write", datenbank, $AppdataDir + "Test_DB.json")
      36. Print
      37. Print "Taste zum Einlesen..."
      38. WaitKey
      39. kontrolle_DB = Create("JSON", $AppdataDir + "Test_DB.json")
      40. Print Json("Text", kontrolle_DB, 1)
      41. WaitKey
      42. End
      Alles anzeigen

      Ich habe bei Name und Ort die Leerzeichen entfernt.

      Grund: Wenn Du fremde JSON-Objekte bearbeitest, kannst Du zwar die Namen sofort erkennen musst aber evtl. die folgenden Leerzeichen
      erst einmal durchzählen. Nicht so gut.
      Programmieren, das spannendste Detektivspiel der Welt.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Michael Wodrich () aus folgendem Grund: kleine Korrekturen

    • Warum, macht man das in einer Datenbank anders? Da bekommst Du auch die ganze Datenbank.
      Json ist eigentlich auch nur zum Austausch gedacht.
      Die Datenbank liegt auf dem Server. Der Bearbeiter fordert einige Datensätze an, bearbeitet diese und liefert sie dann per Json wieder zurück.

      Die Bearbeitung kann per Grid geschehen.

      Oder wie in Roland's Beitrag #9. Damit kann man per Schleife das herausziehen was verarbeitet werden soll.

      H.Brill schrieb:

      Das ganze wieder händisch auseinanderzufriemeln macht

      ja keinen Sinn. :-(
      Doch, eigentlich ist das Austauschformat genau dafür da.
      Ein Key/Value System wie bei den Hash-Arrays. Setzt man sich das Json-Objekt geschickt zusammen bekommt man die gewünschten Teile auch ganz einfach herausgefriemelt.

      Einfach ein wenig dran herumbasteln. Und immer im Hinterkopf behalten: Die Json-Dateien sind flüchtig. Sie werden nur dazu erstellt, schnell Daten von A nach B zu transportieren, danach ist's dann auch schon Datenmüll der gleich wieder entsorgt werden kann.
      (Klar, es gibt auch andere Anwendungsfälle...)
      Programmieren, das spannendste Detektivspiel der Welt.