Delphi/Pascal中如何检测JSON对象是否存在error键?
正确检测JSON数组元素中是否存在"error"键的方法
你的核心问题是没有正确获取数组中的单个JSON对象,直接在顶层JSON值上操作导致检测范围错误,同时循环范围也不符合实际数组长度。以下是修正后的实现:
修正后的完整代码
var response: string; jValue: TJSONValue; jArray: TJSONArray; jObj: TJSONObject; x: Integer; begin response := IdHTTP.Get(url); jValue := TJSONObject.ParseJSONValue(response); try // 先确认顶层是JSON数组类型 if jValue is TJSONArray then begin jArray := TJSONArray(jValue); // 遍历数组的所有元素,用Count获取实际长度 for x := 0 to jArray.Count - 1 do begin // 将当前数组元素转为JSONObject jObj := jArray.Items[x] as TJSONObject; if Assigned(jObj) then begin // 检查当前对象是否包含"error"键 if jObj.ContainsKey('error') then begin Continue; // 存在则跳过当前元素 end; // 处理无error的对象 memo.Lines.Add('cod_item :' + jObj.GetValue<string>('item')); memo.Lines.Add('cod: ' + jObj.GetValue<string>('cod')); end; end; end; finally jValue.Free; // 记得释放JSON对象 end; end;
关键修正点说明
- 精准定位当前对象:先把顶层
jValue转为TJSONArray,再通过Items[x]拿到单个元素并转为TJSONObject,确保检测范围仅限当前遍历的对象,而非整个JSON结构。 - 安全的键存在检测:使用
JSONObject.ContainsKey('error')直接判断当前对象是否包含目标键,不会触发崩溃;也可以用jObj.TryGetValue('error', tmpValue),只要针对当前对象调用就不会出错。 - 适配动态数组长度:用
jArray.Count - 1代替固定的2,自动适配不同长度的JSON数组,避免越界访问。 - 内存安全:添加
finally块释放jValue,防止内存泄漏。
你之前方法的问题分析
jValue.FindValue('error'):这个方法会递归搜索整个JSON结构,只要任何层级存在error键都会返回结果,无法精准检测当前遍历的单个对象。jValue.TryGetValue('error', jArray):你调用的是顶层JSON值的TryGetValue,但顶层是数组而非对象,类型不匹配自然会出错;必须针对每个数组元素的JSONObject调用该方法。
内容的提问来源于stack exchange,提问作者Lucas Medeiros
相关产品推荐
相关产品推荐

