Danke für die erhellenden Hinweise!
Ja, da fällt es mir wie Schuppen von den Augen, zumal ich nicht zum erstenmal mit dem Problem zu tun habe, dass Objekt-Variablen eben 'nur' Zeiger sind.
Ich nehme an, dass im vorliegenden Fall mit 'Kopie' eine sog. 'Deep Copy' gemeint ist. Das ist ja eigentlich ziemlich umständlich, aber es funktioniert:
Delphi-Quellcode:
function DeepCopy(aValue: TObject): TObject;
var
MarshalObj: TJSONMarshal;
UnMarshalObj: TJSONUnMarshal;
JSONValue: TJSONValue;
begin
Result:=
nil;
MarshalObj := TJSONMarshal.Create;
UnMarshalObj := TJSONUnMarshal.Create;
try
JSONValue := MarshalObj.Marshal(aValue);
try
if Assigned(JSONValue)
then
Result:= UnMarshalObj.Unmarshal(JSONValue);
finally
JSONValue.Free;
end;
finally
MarshalObj.Free;
UnMarshalObj.Free;
end;
end;
Function TSpManager.CCRequest(accesspoint:
string; offset: Integer = 0; Limit: Integer = 50):TJSONValue;
var Client: TRestClient;
Request: TRESTRequest;
URL:
string;
begin
result:=
NIL;
URL:= '
https://api.spotify.com' + accesspoint;
Client:= TRESTClient.Create(
URL);
Request:= TRESTRequest.Create(Client);
try
[...]
Request.Execute;
If Request.Response.StatusCode = 200
Then
begin
result:= TJSONValue(DeepCopy(TObject(Request.response.JSONValue)));
end;
finally
Client.free;
end;
end;
Lästig dabei ist allerdings, dass die Kopie explizit freigegeben werden muss, was auch bei der folgenden Alternative nötig ist:
Delphi-Quellcode:
Function TSpManager.CCRequest(accesspoint:
string; offset: Integer = 0; Limit: Integer = 50):TJSONValue;
var Client: TRestClient;
Request: TRESTRequest;
URL:
string;
begin
[...]
try
[...]
Request.Execute;
If Request.Response.StatusCode = 200
Then
begin
result := TJSONObject.ParseJSONValue(TEncoding.utf8.GetBytes(Request.response.content), 0)
end;
finally
Client.free;
end;
end;
Letztlich habe ich das Problem gelöst, indem ich FRequest und FClient als Class Member deklariert habe.
Das funktioniert anscheinend zuverlässig und vermutlich schneller als die o.g. Alternativen
Gruß LP