如何将TRESTResponse.JSONValue赋值给已创建的TJSONArray及TJSONObject?
Delphi中独立管理TJSONArray与TJSONObject的实现方案
一、将TRESTResponse的JSON数组转移到独立的TJSONArray
由于TRESTResponse释放时会连带释放其JSONValue指向的对象,要创建不受其管理的独立数组,需克隆原数组的所有元素,而非直接强转赋值:
- 在窗体类中声明私有字段:
private FMyJSONArray: TJSONArray;
- 窗体
OnCreate事件中初始化数组:
procedure TForm1.FormCreate(Sender: TObject); begin FMyJSONArray := TJSONArray.Create; end;
- 从
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;
- 窗体
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
相关产品推荐
相关产品推荐

