Du machst dir das zu kompliziert. Du musst das, was du in dein JSON-Array reinsteckst nicht nachhalten um es irgendwann freizugeben. Das JSON-Array selbst muss alles, was in ihm drin steckt auch mit freigeben wenn es sich freigibt.
Das ist genauso wie bei einer TObjectList<T> im Vergleich zu einer TList<T>. Erstere gibt die in im enthaltenen Objekte auch mit frei.
Falls ich dein Problem nicht falsch verstanden habe bringt dich das Beispiel hier hoffentlich weiter:
Delphi-Quellcode:
program Project1;
{$APPTYPE CONSOLE}
{$R *.res}
uses System.SysUtils, System.JSON, System.Generics.Collections, Rest.Json;
type
TPerson = class
var name: String;
end;
function createPersonList(): TList<TPerson>;
var
newPerson: TPerson;
begin
Result := TObjectList<TPerson>.Create({ownsObjects:}True);
newPerson := TPerson.Create();
newPerson.name := 'Jupp Schmitz';
Result.Add(newPerson);
newPerson := TPerson.Create();
newPerson.name := 'Dagobert Duck';
Result.Add(newPerson);
end;
procedure fillJsonArray(
const jsonArray: TJSONArray;
const persons: TList<TPerson>
);
var
asJsonObject: TJsonObject;
person: TPerson;
begin
for person in persons do
begin
asJsonObject := Rest.Json.TJson.ObjectToJsonObject(person);
jsonArray.Add(asJsonObject);
// Das TJsonObject gehört nun zum JSON-Array. Wenn das JSON-Array
// freigegeben wird, dann auch alles was in ihm drinsteckt
end;
end;
procedure p();
var
personList: TList<TPerson>;
jsonArray: TJsonArray;
begin
personList := nil;
jsonArray := nil;
try
personList := createPersonList();
jsonArray := TJsonArray.Create();
fillJsonArray(jsonArray, personList);
WriteLn( jsonArray.ToString() );
finally
jsonArray.Free();
personList.Free();
end;
end;
begin
p();
readln;
end.