JSON + globale Konfigurationsoptionen?

Anfängerfragen zum Programmieren mit PureBasic.
oO0XX0Oo
Beiträge: 55
Registriert: 21.07.2017 22:36

JSON + globale Konfigurationsoptionen?

Beitrag von oO0XX0Oo »

Hallo,

ich möchte ein Programm schreiben, welches ich bisher in AutoHotkey
entwickelt habe. Dort verwende ich eine .ini Datei zur Speicherung
der Optionen.

PB bietet ja eine JSON Implementierung an und von daher würde
ich das Format wohl wechseln.

Ich habe in den verschiedenen Funktionen in AHK Zugriff auf ein
globales (mehrdimensionales) array, das ich mit den Daten aus
der .ini Datei füttere.

Was ist denn der beste Weg in PB, um Konfigurationsoptionen
global in Prozeduren zur Verfügung zu stellen, wenn ich sie
aus einer JSON Datei ausgelesen habe? Einige Prozeduren
werden natürlich auch wiederum Änderungen an der
Konfiguration vornehmen...
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: JSON + globale Konfigurationsoptionen?

Beitrag von GPI »

Am einfachsten ist es, wenn du eine Structure anlegst, wo du alles ablegst und es dann in eine globale Variable packst.

Code: Alles auswählen

Structure config
  option1.i
  option2.i
  name.s
  Array values.i(10,10)
EndStructure

Global config.config

config\option1=2
config\option2=3
config\name="Hallo"
For i=0 To 9
  For a=0 To 9
    config\values(i,a)=i*100+a
  Next
Next

js=CreateJSON(#PB_Any)
InsertJSONStructure( JSONValue(js), @config, config)
size=ExportJSONSize(js)
*buffer=AllocateMemory(size+1);zero-string
If ExportJSON(js,*buffer,size)=0
  Debug "Error"
  End
EndIf
Debug PeekS(*buffer,-1,#PB_UTF8)
FreeJSON(js)

;- load config from *buffer, size

newconfig.config
jsout=CatchJSON(#PB_Any,*buffer,size)
ExtractJSONStructure(JSONValue(jsout), @newconfig, config)

Debug newconfig\name
Debug newconfig\option1
edit: Du kannst auch mit ComposeJSON() und ParseJSON() arbeiten, wenn du ohne buffer es machen willst.
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
oO0XX0Oo
Beiträge: 55
Registriert: 21.07.2017 22:36

Re: JSON + globale Konfigurationsoptionen?

Beitrag von oO0XX0Oo »

Vielen lieben Dank, GPI!
Benutzeravatar
TroaX
Beiträge: 661
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Pop_OS! | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Pop_OS!
Wohnort: NRW
Kontaktdaten:

Re: JSON + globale Konfigurationsoptionen?

Beitrag von TroaX »

Oder du benutzt einfach die Ini-Datei mit der Preference-Bibliothek. Denn so lange du auf Eigenschaften von JSON nicht angewiesen bist, kannste auch die Ini nehmen.
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Pop_OS!
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Pop_OS!
NAS: Fritz.Box :lol:
Coding: Purebasic 6.04 | PHP | HTML | CSS | Javascript
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: JSON + globale Konfigurationsoptionen?

Beitrag von GPI »

TroaX hat geschrieben:Oder du benutzt einfach die Ini-Datei mit der Preference-Bibliothek. Denn so lange du auf Eigenschaften von JSON nicht angewiesen bist, kannste auch die Ini nehmen.
Relativ, Felder lassen sich nicht wirklich gut abdecken. Und es kann auch umfangreicher sein.

siehe hier:

Code: Alles auswählen

Structure config
  option1.i
  option2.i
  name.s
  Array values.i(10,10)
EndStructure

Global config.config


Procedure SaveConfig(*config.config,file.s,flag=#PB_JSON_PrettyPrint)
  Protected js,ret
  js=CreateJSON(#PB_Any)
  If js
    InsertJSONStructure( JSONValue(js), *config, config)
    ret=SaveJSON(js,file,flag)
    FreeJSON(js)
  EndIf
  ProcedureReturn ret
EndProcedure
Procedure LoadConfig(*config.config,file.s)
  Protected js,ret  
  js=LoadJSON(#PB_Any,file)
  If js
    ExtractJSONStructure(JSONValue(js), *config, config)
    ret=#True
    FreeJSON(js)
  EndIf
  ProcedureReturn ret
EndProcedure
 
config\option1=2
config\option2=3
config\name="Hallo"
For i=0 To 10
  For a=0 To 10
    config\values(i,a)=i*100+a
  Next
Next

SaveConfig(config,"config.json")


newconfig.config
LoadConfig(newconfig,"config.json")


Debug newconfig\name
Debug newconfig\option1
laden und speichern ist schnell erledigt. Du musst nur in der Structure einen Eintrag einfügen. Eventuell musst du an einer stelle einen default-Wert setzen, aber das wars schon.

Bei bei der Preference-Bibliothek musst du unter speichern und laden nahezu den gleichen Quellcode angeben. Ist auch fehleranfälliger, wenn du dich da verschreibst. Das kann hier nicht passieren, die Structur verhindert schreibfehler. Auch kann man so sehr schnell feststellen, was alles gespeichert wird. Simpel alles in der Config-Structure.

Edit: Den einzigen wirklich großen Nachteil seh ich aktuell, das ExtractJSONStructure die Structure immer löscht.
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: JSON + globale Konfigurationsoptionen?

Beitrag von GPI »

Ich hab mal hier http://www.purebasic.fr/german/viewtopi ... =8&t=30299 ein Include gepostet, die komfortable JSON-Config ermöglicht - mit Defaultwerten.
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
oO0XX0Oo
Beiträge: 55
Registriert: 21.07.2017 22:36

Re: JSON + globale Konfigurationsoptionen?

Beitrag von oO0XX0Oo »

Vielen Dank für all eure Antworten hier!
Antworten