Delphi:如何克隆TJSONArray?实现结果转移而非添加
直接接管GetRequest返回的TJSONArray所有权,避免嵌套数组
你当前的代码会创建一个新的TJSONArray,并将GetRequest返回的数组作为子元素添加进去,最终生成嵌套数组(比如返回[1,2]时,结果会是[[1,2]])。要实现“转移”而非添加,需要直接让LJsonArray接管GetRequest返回数组的所有权,同时处理好JSON对象的父子关系避免内存问题。
修改GetRequest函数
首先需要将返回的数组从父JSON对象中分离,确保所有权转移给调用者:
function TForm1.GetRequest: TJSONArray; var LResponse: IResponse; begin LResponse := TRequest .New.BaseURL('myEndPoint') .Accept('application/json') .Get; Result := LResponse.JSONValue.GetValue<TJSONArray>('structure'); // 从父对象移除,确保所有权转移给调用者,避免父对象释放时销毁该数组 if Assigned(Result) then Result.RemoveFromParent; end;
修改Button1Click过程
不再创建新的TJSONArray,直接接收GetRequest的返回值,并负责其生命周期管理:
procedure TForm1.Button1Click(Sender: TObject); var LJsonArray : TJSONArray; begin LJsonArray := GetRequest; try if Assigned(LJsonArray) then begin Memo1.Lines.Clear; Memo1.Lines.Add(LJsonArray.ToJSON); end; finally // 现在我们拥有数组的所有权,必须手动释放 LJsonArray.DisposeOf; end; end;
关键说明
RemoveFromParent:将数组从原来的父JSON对象中分离,这样父对象释放时不会销毁该数组,所有权完全转移给调用者(即Button1Click中的LJsonArray)。- 不再调用
TJSONArray.Create:直接使用GetRequest返回的数组,避免创建多余的外层数组,也就不需要Add方法。 - 空值判断:添加
Assigned(LJsonArray)确保当接口返回的JSON中没有structure字段时,不会触发空指针异常。
内容的提问来源于stack exchange,提问作者Daiane Santana
相关产品推荐
相关产品推荐

