Oder gibt es auch eine Möglichkeit eine Klasse abzuleiten von ObjectList<T> wo der Interceptor dran und von der Klasse dann meine ObjectLists zu abzuleiten
Nein, das geht nicht. Man kann an eine (generische) Klasse kein generisches Attribut anhängen.
Das wäre dann vielleicht mal was für eine Erweiterung der
REST.Json.Helpers Unit.
Ich habe das mal entsprechend erweitert und vereinfacht. Die neue Version findet man bei GitHub:
https://github.com/UweRaabe/REST-JSon-Helpers
Bezogen auf dein Code-Beispiel und erweitert um die direkten Verarbeitung der Listen könnte das nun so aussehen:
Delphi-Quellcode:
type
TPerson = class
private
FName: String;
public
property Name: String read FName write FName;
end;
JsonObjectListPersonAttribute = class(JsonObjectListAttribute<TPerson>);
type
[JsonObjectListPerson]
TPersonListe = class(TObjectList<TPerson>);
type
{ Wrapper }
TPersonJSON = class
private
[JSONOwned(False)]
FPersonListe: TPersonListe;
public
constructor Create;
destructor Destroy; override;
property PersonListe: TPersonListe read FPersonListe write FPersonListe;
end;
...
const
cNamen: TArray<String> = ['Name1', 'Name2', 'Name3'];
cPersonListe = '[{"name":"Name1"},{"name":"Name2"},{"name":"Name3"}]';
cPersonJSON = '{"personListe":[{"name":"Name1"},{"name":"Name2"},{"name":"Name3"}]}';
function CheckListe(AListe: TPersonListe): Boolean;
var
I: Integer;
begin
Result := (AListe.Count = Length(cNamen));
if Result then begin
for I := 0 to AListe.Count - 1 do
if AListe[I].Name <> cNamen[I] then
Exit(False);
end;
end;
var
lPersonJSON: TPersonJSON;
lPerson: TPerson;
lJSONString: String;
lPersonListe: TPersonListe;
begin
{ mit Wrapper }
lPersonJSON := TPersonJSON.Create;
try
for var lName in cNamen do
begin
lPerson := TPerson.Create;
lPerson.Name := lName;
lPersonJSON.PersonListe.Add(lPerson);
end;
lJSONString := TConvert.ToJSONString(lPersonJSON);
Assert(lJSONString = cPersonJSON);
finally
lPersonJSON.Free;
end;
lPersonJSON := TConvert.FromJSON<TPersonJSON>(cPersonJSON);
try
Assert(CheckListe(lPersonJSON.PersonListe));
finally
lPersonJSON.Free;
end;
{ Liste direkt }
lPersonListe := TPersonListe.Create;
try
for var lName in cNamen do
begin
lPerson := TPerson.Create;
lPerson.Name := lName;
lPersonListe.Add(lPerson);
end;
lJSONString := TConvert.ToJSONString(lPersonListe);
Assert(lJSONString = cPersonListe);
finally
lPersonListe.Free;
end;
lPersonListe := TPersonListe.Create;
try
lPersonListe.AddRange(TConvert.FromJSONArray<TPerson>(cPersonListe));
Assert(CheckListe(lPersonListe));
finally
lPersonListe.Free;
end;
end;