You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 10:55:17