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

如何获取TJSONArray元素数量?解决循环计数访问冲突问题

解决TJSONArray循环访问冲突问题

你的代码存在几个关键问题,导致使用JsonArray.Count-1时出现访问冲突,以下是问题分析和修正方案:

问题点

  1. 声明的JSONArray变量从未被赋值,if Assigned(JSONArray)的判断完全无效,后续循环也未使用该变量。
  2. 循环内重复解析整个JSON字符串,既浪费资源,还会造成内存泄漏(解析出的JsonValue未释放)。
  3. 试图使用未初始化的JSONArray.Count,必然引发访问冲突,正确做法是使用解析后得到的数组的Count属性。

修正后的代码

var
  JsonValue: TJsonValue;
  JsonArray: TJsonArray;
  st: string;
  id, name, description, sku, price: string;
  i, j: integer;
begin
  st := Memo1.Text;
  j := 1;

  // 仅解析一次JSON,避免重复操作与内存泄漏
  JsonValue := TJSONObject.ParseJSONValue(st);
  try
    if JsonValue is TJSONArray then
    begin
      JsonArray := JsonValue as TJSONArray;
      // 使用解析得到的数组Count作为循环上限
      for i := 0 to JsonArray.Count - 1 do
      begin
        // 先判断元素是否为TJSONObject,避免类型转换错误
        if JsonArray.Items[i] is TJSONObject then
        begin
          id := (JsonArray.Items[i] as TJSONObject).Get('id').JSONValue.Value;
          sku := (JsonArray.Items[i] as TJSONObject).Get('sku').JSONValue.Value;
          description := (JsonArray.Items[i] as TJSONObject).Get('description').JSONValue.Value;
          name := (JsonArray.Items[i] as TJSONObject).Get('name').JSONValue.Value;
          price := (JsonArray.Items[i] as TJSONObject).Get('price').JSONValue.Value;

          stringgrid1.Cells[1,j] := sku;
          stringgrid1.Cells[2,j] := name;
          stringgrid1.Cells[4,j] := description;
          stringgrid1.Cells[3,j] := price;
          j := j + 1;
        end;
      end;
    end;
  finally
    JsonValue.Free; // 释放解析资源,避免内存泄漏
  end;
end;

核心改动说明

  • 移除多余的JSonObject变量,ParseJSONValue是静态方法,无需实例化TJSONObject即可调用。
  • 将JSON解析逻辑移至循环外,通过try...finally确保解析资源被正确释放。
  • 依赖解析后得到的JsonArray的Count属性遍历所有元素,彻底解决循环上限问题。
  • 增加元素类型判断,避免数组中存在非对象元素时引发类型转换错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 06:05:02