Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Wie kann man Klassen-Felder in eine Json-Datei speichern (https://www.delphipraxis.net/212144-wie-kann-man-klassen-felder-eine-json-datei-speichern.html)

juergen 24. Dez 2022 23:25

Wie kann man Klassen-Felder in eine Json-Datei speichern
 
Hallo zusammen,

bisher hatte ich gerne Ini-Dateien eingesetzt. In einem neuen Tool von mir möchte ich nun eine json-Datei anstelle einer ini-Datei anwenden.

Also einige Klassen mit den benötigten Feldern erstellt (im Prinzip pro Sektion aus einer Ini-Datei eine eigene Klasse).
Über
Delphi-Quellcode:
my_jsonObj := TJSONObject.ParseJSONValue( TFile.ReadAllText(....
lese ich die Json-Datei in meine Json-Objektvariable ein.
Danach weise ich meinen Klassen-Feldern die Werte über
Delphi-Quellcode:
 JsonDatabaseParam.DatenbankName := my_jsonObj.GetValue<string>(...
zu.

Wie kann ich nun die Werte meiner Klassen-Felder in eine Json-Datei schreiben?

Vielen Dank im Voraus und schöne Weihnachten! :xmas:

Gausi 25. Dez 2022 11:39

AW: Wie kann man Klassen-Felder in eine Json-Datei speichern
 
Wenn du es einfach und bequem haben willst, dann würde ich dir die Neon-Library empfehlen.

https://blogs.embarcadero.com/effici...-neon-library/

Die konvertiert auch komplexere Klassenstrukturen relativ problemlos nach JSON und wieder zurück. Man muss ggf. die Deklaration der Klasse leicht anpassen (z.B. Felder markieren, die nicht gespeichert werden sollen), aber nach kurzer Einarbeitung möchte ich das nicht mehr missen.

Ansonsten halt die JSON-Struktur selber aufbauen ...

juergen 25. Dez 2022 17:25

AW: Wie kann man Klassen-Felder in eine Json-Datei speichern
 
Zitat:

..dann würde ich dir die Neon-Library empfehlen...
Vielen Dank! :thumb: :-) Genau sowas habe ich mir vorgestellt. Habe inzw. auch noch SuperObject entdeckt.

Gausi 26. Dez 2022 08:55

AW: Wie kann man Klassen-Felder in eine Json-Datei speichern
 
Ja, über SuperObject bin ich auch gestolpert bei meiner Suche nach sowas. Bin dann bei Neon gelandet, weil Neon auch Dictionaries direkt mit abfrühstückt - zumindest solche mit Strings als Key. Das war bei meinem Einsatzzweck wichtig. (Ging dabei um ein internes Tool für die Kommunikation mit VirusTotal, und ich wollte die relativ verschachtelten JSON-Antworten von der VT-API nicht selbst parsen. Da habe ich mir einfach eine passende Klassenstruktur gebaut und dann diese Library drauf angesetzt.)

Olli73 26. Dez 2022 11:14

AW: Wie kann man Klassen-Felder in eine Json-Datei speichern
 
Hier kann man auch online aus JSON eine Delphi-Klasse machen:

https://jsontodelphi.com/

Bbommel 28. Dez 2022 11:33

AW: Wie kann man Klassen-Felder in eine Json-Datei speichern
 
Wenn du schon mit TJSONObject.ParseJSONValue arbeitest und deine Konfig-Klasse relativ einfach aufgebaut ist, dann nimm doch für das Gegenteil auch die mitgelieferte Funktion:
Delphi-Quellcode:
  TFile.WriteAllText(TJson.ObjectToJsonString(my_jsonObj));
Klar, ist nicht so mächtig wie die Zusatzbibliotheken, die hier genannt wurden. Aber wenn das Lesen mit den Funktionen der RTL funktioniert, dann sollte es eigentlich auch fürs Schreiben reichen. Bei meinen einfachen Objekten funktioniert das so problemlos.

juergen 28. Dez 2022 13:23

AW: Wie kann man Klassen-Felder in eine Json-Datei speichern
 
@Bbommel,

danke für den Hinweis :thumb:, ich hatte das auch schon gesehen. HAbe mich momentan (vorläufig) auf
Delphi-Quellcode:
TJsonTextWriter
und
Delphi-Quellcode:
TStringWriter
festgelegt. Auch kann man sich so leicht eine mehrschichtige Struktur der Json-Datei aufbauen und die Datei lässt sich direkt formatieren, wenn gewünscht.
Delphi-Quellcode:
...
VAR
  Writer: TJsonTextWriter;
  StringWriter: TStringWriter;
BEGIN
  StringWriter := TStringWriter.Create( );
  Writer := TJsonTextWriter.Create( StringWriter );
  Writer.Formatting := TJsonFormatting.Indented;  
 
  Try
    Writer.WriteStartObject;
    Writer.WritePropertyName( 'Database' );
    Writer.WriteStartObject;
    Writer.WritePropertyName( 'ServerName' );
    Writer.WriteValue( JsonDatabaseParam.ServerName );
    Writer.WritePropertyName( 'DBAdminUser' );
    Writer.WriteValue( JsonDatabaseParam.DBAdminUser );
    Writer.WritePropertyName( 'DatenbankName' );
    Writer.WriteValue( JsonDatabaseParam.DatenbankName );
    Writer.WritePropertyName( 'Password' );
    Writer.WriteValue( JsonDatabaseParam.Password );
    Writer.WritePropertyName( 'DatenbankProvider' );
    Writer.WriteValue( JsonDatabaseParam.DatenbankProvider );

    Writer.WriteEndObject;

    Writer.WritePropertyName( 'System' );
    Writer.WriteStartObject;
...
    Writer.WriteEndObject;
    Writer.WriteEndObject;
  FINALLY
    StringWriter.Free;
    Writer.Free;
  END;
...
Trotzdem habe ich angefangen mich in die Neon-Library einzuarbeiten, da ich in Zukunft wohl häufiger mit Json zu tun habe werde. Und das de- und serialisieren von ganzen Klassen scheint damit leicht möglich.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:27 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz