![]() |
TJSONObjectBuilder keine leeren Objekte/Arrays
Hallo zusammen,
ich schaue mir grade das
Delphi-Quellcode:
Framework an. Rufe ich dort:
System.JSON.Builders
Delphi-Quellcode:
auf, dann erhalte ich als Output:
Builder
.BeginObject .BeginObject('test') .EndObject .EndObject
Code:
also ein leeres Objekt namens "test".
{
"test": {} } Macht soweit natürlich Sinn. Meine Frage jetzt aber trotzdem: :?: Ist es möglich die Objekte/Arrays erst dann zu schreiben, wenn sie mindestens ein eigenes Feld besitzen? Hintergrund ist, dass ich eine Hierachie von Klassen serialisieren will. Jede Klasse besitzt eine
Delphi-Quellcode:
Methode, der ich eine Builder Instanz und den Feldnamen übergeben will. Die Instanz soll sich dann selbstständig serialisieren. Jetzt kann es passieren, dass alle Felder der Instanz die Standardwerte besitzen. In diesem Falle sollen die Felder nicht im JSON erscheinen.
Serialize
Ich würde nun gerne weiterhin die Felder nach und nach prüfen, also:
Delphi-Quellcode:
Ist sowas mit dem
Builder.BeginObject(FieldName);
if (Field1 <> Default1) then Builder.Add('field1', Field1); if (Field2 <> Default2) then Builder.Add('field2', Field2); .. Builder.EndObject;
Delphi-Quellcode:
Framework möglich, oder müsste ich tatsächlich vor dem
System.JSON.Builders
Delphi-Quellcode:
erstmal alle Felder auf Standardwerte prüfen?
BeginObject
Viele Grüße Zacherl |
AW: TJSONObjectBuilder keine leeren Objekte/Arrays
BeginObject erstellt ein neues Objekt
und Objekte ohne Eigenschaften sind natürlich möglich. Also vorher prüfen oder nachher das Objekt wieder löschen. :roll: |
AW: TJSONObjectBuilder keine leeren Objekte/Arrays
Zitat:
Delphi-Quellcode:
Objekt nachher löschen: Sicherlich. Im Builder selbst habe ich dafür allerdings keine entsprechenden Methoden gefunden. Einziges Workaround, was mir im Moment vorschwebt, ist es vor dem
if (Field1 <> Default1) and (Field2 <> Default2) and ... then
begin Builder.BeginObject(FieldName); if (Field1 <> Default1) then Builder.Add('field1', Field1); if (Field2 <> Default2) then Builder.Add('field2', Field2); .. Builder.EndObject; end;
Delphi-Quellcode:
die Position von
Builder.BeginObject(FieldName)
Delphi-Quellcode:
zu sichern und nach dem
TStreamWriter(Builder.Writer).BaseStream
Delphi-Quellcode:
zu schauen, ob die Position mehr als 2 Bytes erhöht wurde. Dann könnte ich das leere Objekt über
Builder.EndObject
Delphi-Quellcode:
wieder löschen. Schön ist aber anders.
Stream.Position -= 2
|
AW: TJSONObjectBuilder keine leeren Objekte/Arrays
Delphi-Quellcode:
if (Field <> Default) then Builder.Add('field', Field);
in eine Methode auslagern, da prüfen und wenn True, vorher schauen, ob das Objekt angelegt wurde und wenn nicht, dann das BeginObject und danach das Add :zwinker: Am Ende auch nur das EndObject, wenn das Objekt existiert. |
AW: TJSONObjectBuilder keine leeren Objekte/Arrays
Eine Frage die garantiert nicht weiterhilft: Ist das denn schlimm wenn da ein "leeres Objekt" ist? Als Mensch hätte ich direkt gesehen "Ja, 'test' ist belegt und darin ist nichts besonderes mehr das vom Standard abweicht".
|
AW: TJSONObjectBuilder keine leeren Objekte/Arrays
Zitat:
Zitat:
![]() Jede einzelne Instruction kann z.b. bis zu 10 Operanden besitzen. Wenn ich da jetzt für jeden möglichen Eintrag ein leeres Objekt anlege, kann das doch ziemlich schnell unübersichtlich werden. |
AW: TJSONObjectBuilder keine leeren Objekte/Arrays
Wir hatten ein ähnliches Problem, allerdings mehr "allgemein" zum feststellen ob ein Object modifiziert wurde.
Die Lösung bei uns war konsequent für alle properties Setter zu verwenden. aka :
Delphi-Quellcode:
So können wir im Source einfach testen:
procedure setProperty1(const Value : integer);
begin if Value <> fProperty1 then begin fproperty1 := Value; // Call do set the modifiedFlag domodified; end; end;
Delphi-Quellcode:
Hat sich bewährt kommt aber wohl auf den Anwendungsfall an...
if Obj.modified then .......
|
AW: TJSONObjectBuilder keine leeren Objekte/Arrays
Zitat:
Delphi-Quellcode:
Event besitzen meine Klassen sogar schon. Ist leider für meinen speziellen Fall nicht die beste Lösung, da durch eine Modifikation der Wert einer Property ja auch wieder auf den Standardwert gesetzt werden könnte. Das hieße, dass ich den Check lediglich in die Setter auslagern würde und dann noch einen internen Counter bräuchte, der bei
Changed
Delphi-Quellcode:
inkrementiert und bei
Property <> Default
Delphi-Quellcode:
wieder dekrementiert wird (
Property = Default
Delphi-Quellcode:
).
Counter = 0 <=> Objekt hat nur Default Properties
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:27 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz