Hallo,
Da die Rest Bibliothek unter Delphi 10.3 ja etwas kaputt ist, versuche ich per JSON Marchal / Unmarchal Objekte in JSON umzuwandeln und umgekehrt.
Das funktioniert mit festgelegten Datentypen auch sehr gut.
Nun wollte ich meine Methoden aufgrund von Wiederverwendbarkeit etwas generischer schreiben. Aber hier scheint Delphi ein Problem zu haben.
Mein Objekt sieht so aus:
Es gibt eine Klasse, die hat wiederrum ein generisches Array als Property. So kann ich listen von Objekten per Json hin und her übertragen.
Wenn ich dies allerdings nun mit Generics schreibe, hat das Unmarchalling ein Problem, es kann die Instanz nicht erstellen.
Hier mal das Code, der das Ganze verdeutlicht:
Delphi-Quellcode:
tyoe
TwwObjekt = class
public
wert1: String;
wert2: String;
end;
TwwRestObjektListe<T> = class(TObject)
strict private
FObjekte: TArray<T>;
public
property lstObjekte: TArray<T> read FObjekte write FObjekte;
end;
Diesen Teil nutze ich um die Objekte umzuwandeln:
Delphi-Quellcode:
var
lst: TwwRestObjektListe<TwwObjekt>;
aObjs: TArray<TwwObjekt>;
obj: TwwObjekt;
Mar: TJSONMarshal;
jsObjekt: TJSONObject;
jsUnMarshal: TJSONUnMarshal;
jsValue: TJSONValue;
begin
lst := TwwRestObjektListe<TwwObjekt>.Create;
SetLength(aObjs, 1);
obj := TwwObjekt.Create;
obj.wert1 := '1234';
obj.wert2 := '1';
aObjs[0] := obj;
lst.lstObjekte := aObjs;
Mar := TJSONMarshal.Create(TJSONConverter.Create);
try
jsObjekt := Mar.Marshal(lst) as TJSONObject;
edtLines.Lines.Add(jsObjekt.ToString);
finally
FreeAndNil(Mar);
end;
jsUnMarshal := TJSONUnMarshal.Create;
try
jsValue := TJSONObject.ParseJSONValue(jsObjekt.ToString);
try
/// =>>>>> HIER SCHLÄGT ES FEHL
lst := jsUnMarshal.Unmarshal(jsValue) as TwwRestObjektListe<TwwObjekt>;
finally
FreeAndNil(jsValue);
end;
finally
FreeAndNil(jsUnMarshal);
end;
end;
Ein JSON Objekt sieht dann so aus:
Code:
{"type":"Unit2.TwwRestObjektListe<Unit2.TwwObjekt>","id":1,"fields":{"FObjekte":[{"type":"Unit2.TwwObjekt","id":2,"fields":{"wert1":"1234","wert2":"1"}}]}}
Dies ist laut Validator ein gültiges JSON Objekt.
Fehlermeldung:
Typ Unit2.TwwRestsObjektListe<Unit2.TwwObjekt> kann nicht instantiiert werden
Vielleicht habe ich ja auch nur einen Denkfehler.