Seite 1 von 1

JSON + globale Konfigurationsoptionen?

Verfasst: 22.07.2017 00:45
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...

Re: JSON + globale Konfigurationsoptionen?

Verfasst: 22.07.2017 10:11
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.

Re: JSON + globale Konfigurationsoptionen?

Verfasst: 22.07.2017 10:31
von oO0XX0Oo
Vielen lieben Dank, GPI!

Re: JSON + globale Konfigurationsoptionen?

Verfasst: 23.07.2017 13:48
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.

Re: JSON + globale Konfigurationsoptionen?

Verfasst: 23.07.2017 21:57
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.

Re: JSON + globale Konfigurationsoptionen?

Verfasst: 30.07.2017 19:13
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.

Re: JSON + globale Konfigurationsoptionen?

Verfasst: 03.08.2017 10:26
von oO0XX0Oo
Vielen Dank für all eure Antworten hier!