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

如何将TRESTResponse.JSONValue赋值给已创建的TJSONArray及TJSONObject?

Delphi中独立管理TJSONArray与TJSONObject的实现方案

一、将TRESTResponse的JSON数组转移到独立的TJSONArray

由于TRESTResponse释放时会连带释放其JSONValue指向的对象,要创建不受其管理的独立数组,需克隆原数组的所有元素,而非直接强转赋值:

  1. 在窗体类中声明私有字段:
private
  FMyJSONArray: TJSONArray;
  1. 窗体OnCreate事件中初始化数组:
procedure TForm1.FormCreate(Sender: TObject);
begin
  FMyJSONArray := TJSONArray.Create;
end;
  1. 从TRESTResponse获取并复制数组元素:
var
  OriginalArray: TJSONArray;
  I: Integer;
  CloneElement: TJSONValue;
begin
  // 从响应中获取原数组
  OriginalArray := xeroResponse.JSONValue as TJSONArray;
  // 逐个克隆元素到独立数组,确保所有权归自己的数组
  for I := 0 to OriginalArray.Count - 1 do
  begin
    CloneElement := OriginalArray.Items[I].Clone;
    FMyJSONArray.AddElement(CloneElement);
  end;
  // 此时释放xeroResponse不会影响FMyJSONArray
end;
  1. 窗体OnDestroy事件中释放独立数组:
procedure TForm1.FormDestroy(Sender: TObject);
begin
  FMyJSONArray.Free;
end;

二、将数组元素赋值给独立的TJSONObject

分两种场景处理:

场景1:保留原数组中的元素,仅复制使用

通过Clone方法复制原对象,新对象可单独释放,不影响原数组:

var
  OriginalObj: TJSONObject;
  MyJSONObject: TJSONObject;
begin
  OriginalObj := FMyJSONArray.Items[x] as TJSONObject;
  // 克隆原对象,获取独立所有权
  MyJSONObject := OriginalObj.Clone as TJSONObject;
  
  // 业务逻辑处理...
  
  // 用完直接释放,原数组元素不受影响
  MyJSONObject.Free;
end;

场景2:移除原数组中的元素,接管其所有权

若不需要保留原数组中的该元素,可通过Remove方法转移所有权,之后可自由释放新对象:

var
  MyJSONObject: TJSONObject;
begin
  // 从原数组移除元素,所有权转移到MyJSONObject
  MyJSONObject := FMyJSONArray.Remove(x) as TJSONObject;
  
  // 业务逻辑处理...
  
  // 用完释放
  MyJSONObject.Free;
end;

内容的提问来源于stack exchange,提问作者Paul Coshott

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 01:42:38