![]() |
TJsonSerializer und polymorphes Array?
Hallo zusammen, ich habe gerade mit TJsonSerializer experimentiert und bin auf folgendes Problem gestoßen:
Delphi-Quellcode:
Ich habe also ein Data[] das eine TAData und eine TBData instanz enthält. Beim serialisieren funktioniert das wunderbar:
Type
TMyKind = (mkA, mkB); [JsonSerialize(TJsonMemberSerialization.&In)] TBaseData = Class [JSonIn] [JsonName('Kind')] Kind: TMyKind; constructor Create; virtual; End; [JsonSerialize(TJsonMemberSerialization.&In)] TAData = Class(TBaseData) [JsonIn] Name: String; constructor Create; override; End; [JsonSerialize(TJsonMemberSerialization.&In)] TBData = Class(TBaseData) [JsonIn] Group: String; [JsonIn] Text: String; constructor Create; override; End; [JsonSerialize(TJsonMemberSerialization.&In)] TMyData = Class [JsonIn] [JsonObjectHandling(TJsonObjectHandling.Reuse)] Data: TArray<TBaseData>; [JsonIn] MainData: TBaseData; constructor Create; virtual; Destructor Destroy; override; End; ... { TMyData } constructor TMyData.Create; begin inherited; SetLength(Data, 2); Data[0] := TAData.Create; Data[1] := TBData.Create; MainData := TBData.Create; end;
Delphi-Quellcode:
fMyData := TMyData.Create;
js := TJsonSerializer.Create; js.Formatting := TJsonFormatting.Indented; s := js.Serialize(fMyData); ... Memo.Text := s;
Code:
Beim Versuch dieses JSON mit Populate wieder einzulesen wird dann aber das Array neu erzeugt (alle Elemente vom Typ TBaseData).
{
"Data": [ { "Name": "A", "Kind": 1 }, { "Group": "B", "Text": "C", "Kind": 0 } ], "MainData": { "Group": "D", "Text": "E", "Kind": 1 } }
Delphi-Quellcode:
Das ergibt nach erneuter Serialisierung:
LMyData := TMyData.Create;
js := TJsonSerializer.Create; js.Populate<TMyData>(Memo.Text, LMyData); // LMyData.Data[0] = TBaseData // LMyData.Data[1] = TBaseData // LMyData.MainData = TBData ... Memo.Text := js.Serialize(LMyData)
Code:
Ich hatte allerdings gehofft, dass durch Angabe von
{
"Data": [ { "Kind": 1 }, { "Kind": 0 } ], "MainData": { "Group": "D", "Text": "E", "Kind": 1 } }
Delphi-Quellcode:
die übergebenen Instanzen erhalten bleiben.
JsonObjectHandling(TJsonObjectHandling.Reuse)
Frage 1: Gibt es eine Möglichkeit, die korrekten Typen für die Array-Elemente zu erhalten? Frage 2: Kann man die Reihenfolge in der js.Serialize den Ausgabestring erzeugt umdrehen (geerbte Properies zuerst -> "Kind" vor "Name")? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:17 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