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

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,防止内存泄漏。

你之前方法的问题分析

  1. jValue.FindValue('error'):这个方法会递归搜索整个JSON结构,只要任何层级存在error键都会返回结果,无法精准检测当前遍历的单个对象。
  2. jValue.TryGetValue('error', jArray):你调用的是顶层JSON值的TryGetValue,但顶层是数组而非对象,类型不匹配自然会出错;必须针对每个数组元素的JSONObject调用该方法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 21:20:43