如何获取TJSONArray元素数量?解决循环计数访问冲突问题
解决TJSONArray循环访问冲突问题
你的代码存在几个关键问题,导致使用JsonArray.Count-1时出现访问冲突,以下是问题分析和修正方案:
问题点
- 声明的
JSONArray变量从未被赋值,if Assigned(JSONArray)的判断完全无效,后续循环也未使用该变量。 - 循环内重复解析整个JSON字符串,既浪费资源,还会造成内存泄漏(解析出的
JsonValue未释放)。 - 试图使用未初始化的
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
相关产品推荐
相关产品推荐

