Seite 1 von 2

Wie speicher ich eine komplexere Struktur?

Verfasst: 06.07.2020 23:51
von Jac de Lad
Hallo,
vielleicht kann mir jemand einen Schubs in die richtige Richtung geben:
Ich hab eine Struktur, z.B:

Code: Alles auswählen

Structure
  Dummy.f
  NocheinDummy.s
  Liste.s()
EndStructure
dann

Code: Alles auswählen

NewList meineliste.Liste()
usw...

Jetzt will ich alle Elemente von meineliste in einer Datei ablegen (oder von mir aus jedes in einer eigenen Datei, wie auch immer), wie kann ich das effizient tun, also ohne jeden String einzeln auszulesen? Kann ich die Größe des einzelnen Elements von meineliste ermitteln und es dann irgendwie als Gesamtheit weiterverarbeiten?

Re: Wie speicher ich eine komplexere Struktur?

Verfasst: 07.07.2020 00:33
von mk-soft

Re: Wie speicher ich eine komplexere Struktur?

Verfasst: 07.07.2020 05:40
von Bisonte
JSON funktioniert auch ... und sieht nicht so gewaltig abschreckend dabei aus ;)

InsertJSONList()
ExtractJSONList()

sind für Listen allein. Wenn es um komplexere Dinge geht : Insert/ExtractJSONStructure....

so für die PB-Hilfe (F1) als Recherche-Tip ;)

Re: Wie speicher ich eine komplexere Struktur?

Verfasst: 07.07.2020 09:39
von Jac de Lad
Vielen Dank, ich schaue mir das alles an und melde mich sobald ich in meinen Tränen ertrinke.

Nachtrag: Puh, OK, JSON geht da natürlich, aber da muss ich ja trotzdem alle Einträge einzeln bearbeiten. Ich suche nach einer Möglichkeit das in einem Rutsch zu erledigen, ähnlich wie die Struktur für ein Windows API, die auch als gesamtes gespeichert werden könnte (abzüglich der Strings, die nur als Adressen vorliegen).

Weiterer Nachtrag: Ich hätte erstmal richtig lesen müssen, mit insertjsonlist kommt man eigentlich schon bequem ganz weit.

Re: Wie speicher ich eine komplexere Struktur?

Verfasst: 07.07.2020 15:03
von Olafmagne
Hallo
Das ganze in einem Beispiel

Code: Alles auswählen

;Creation des Liste und JSON

NewList Names.s()
  AddElement(Names()): Names() = "John"
  AddElement(Names()): Names() = "Jane"
  AddElement(Names()): Names() = "Jim"
If CreateJSON(0)
  InsertJSONList(JSONValue(0), Names())
  Debug ComposeJSON(0,#PB_JSON_PrettyPrint)
EndIf
FreeList(Names())
;Kann jetzt gespeichert werden
;
;(Json laden )-nicht im Code
;Neue Liste und extrakt. von JSON
NewList coord.s()
ExtractJSONList(JSONValue(0), coord())

ForEach coord()
  Debug "Name="+coord()
Next
Olaf

Re: Wie speicher ich eine komplexere Struktur?

Verfasst: 07.07.2020 15:18
von Kiffi
ergänzend für jacdelad noch folgende Befehle:

LoadJSON() und SaveJSON()

Re: Wie speicher ich eine komplexere Struktur?

Verfasst: 07.07.2020 16:38
von Jac de Lad
Ja, ja, das ist klasse. So klappt das auch mit meiner Map. 2 Fragen sind aber aufgekommen: wie übernehme ich z.B. alle Werte von MeineMap("eins"), ohne gleich die gesamte map zu übernehmen? Und wofür genau ist JSONValue() da? Die Hilfe hilft mir da irgendwie nicht wirklich.

Re: Wie speicher ich eine komplexere Struktur?

Verfasst: 07.07.2020 16:51
von Olafmagne
JSONValue() ist der DatenType,
d.h.,diese Function gibt den DatenType des JSON-Eintrag's zurück

Olaf

Re: Wie speicher ich eine komplexere Struktur?

Verfasst: 07.07.2020 21:16
von Jac de Lad
Aber wie hängt das mit InsertJSONList() zusammen? Ich erkenne den Sinn an der Stelle nicht.

Re: Wie speicher ich eine komplexere Struktur?

Verfasst: 08.07.2020 00:04
von mk-soft
Das Einzige was du braucht ist InsertJSONStructure(...) und ExtractJSONStructure(...).

Also genau so wie bei meinen Link nur mit XML. Siehe LoadProjectData(...) und SaveProjectData(...)

Mehr braucht man nicht, da Listen oder Arrays in Strukturen mit übernommen werden.

Auszug

Code: Alles auswählen


Structure udtProjectData
  Version.i
  Date.s
  ; Data
  ;TODO Any Data
  List Text.s() 
EndStructure

Global ProjectData.udtProjectData

; ----

Procedure LoadProjectData(FileName.s, *ProjectData.udtProjectData)
  Protected xml
  
  If FileSize(FileName) > 0
    xml = LoadXML(#PB_Any, FileName)
    If xml And XMLStatus(xml) = #PB_XML_Success
      ExtractXMLStructure(MainXMLNode(xml), *ProjectData, udtProjectData, #PB_XML_NoCase)
      FreeXML(xml)
      ProcedureReturn #True
    EndIf
  EndIf
  ProcedureReturn #False
EndProcedure

; ----

Procedure SaveProjectData(FileName.s, *ProjectData.udtProjectData)
  Protected r1, xml
  
  xml = CreateXML(#PB_Any)
  If xml
    *ProjectData\Version = 101
    *ProjectData\Date = FormatDate("%YYYY-%MM-%DD %HH.%II.%SS", Date())
    If InsertXMLStructure(RootXMLNode(xml), *ProjectData, udtProjectData)
      FormatXML(xml, #PB_XML_ReFormat)
      If SaveXML(xml, FileName)
        r1 = #True
      Else
        r1 = #False
      EndIf
    EndIf
    FreeXML(xml)
  EndIf
  ProcedureReturn r1
EndProcedure