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

Delphi从JSON数组提取Code字段生成数组并检索匹配值的实现方法

问题原因分析

你现有代码功能失效主要是以下几个错误导致的:

  • 逻辑判断错误:你遍历JSON数组拿到的jso是每条完整的人员信息对象,jso.ToString会输出整段对象JSON字符串,永远不可能等于'Code',这行错误判断直接拦截了所有后续匹配逻辑
  • 取值格式错误:直接调用ToString获取Code值会自带引号,比如实际拿到的是"31212",和Edit控件输入的无引号纯字符串对比永远不匹配
  • 异常吞错:你所有的异常捕获都没有任何提示逻辑,接口请求失败、JSON解析失败时你看不到任何报错,无法定位根因
实现方案说明

两种实现方式都可行,根据使用场景选择即可:

  1. 单次查找:直接遍历JSON数组匹配目标Code即可,不需要额外存储数组,性能足够满足需求
  2. 多次高频查找:可以提前提取所有Code存入字符串数组,后续查找直接遍历数组即可,不需要重复解析JSON
修正后可运行代码
procedure Tlog_form.Button2Click(Sender: TObject);
var
  jsv : TJsonValue;
  jsa : TJSONArray;
  jso : TJSONObject;
  data, targetCode, currentCode : string;
  i : Integer;
  found : Boolean;
begin
  targetCode := Trim(Edit1.Text);
  if targetCode = '' then
  begin
    ShowMessage('请输入要查询的Code');
    Exit;
  end;

  // 1. 请求接口数据
  try
    data := GetURLAsString('http://...');
  except
    on E: Exception do
    begin
      ShowMessage('接口请求失败:' + E.Message);
      Exit;
    end;
  end;

  // 2. 解析JSON
  try
    jsv := TJSONObject.ParseJSONValue(data);
    if not Assigned(jsv) or not (jsv is TJSONArray) then
    begin
      ShowMessage('JSON格式错误');
      Exit;
    end;

    jsa := TJSONArray(jsv);
    found := False;
    try
      // 3. 遍历匹配Code
      for i := 0 to jsa.Size - 1 do
      begin
        if not jsa.Get(i).InheritsFrom(TJSONObject) then Continue;
        jso := TJSONObject(jsa.Get(i));
        // 直接获取无引号的Code值
        currentCode := jso.GetValue<string>('Code', '');
        if currentCode = targetCode then
        begin
          found := True;
          Break;
        end;
      end;

      if found then
        ShowMessage('found it')
      else
        ShowMessage('未找到对应Code');
    finally
      jsv.Free;
    end;
  except
    on E: Exception do
    begin
      ShowMessage('处理失败:' + E.Message);
    end;
  end;
end;
提取Code数组的实现(可选)

如果需要生成Code数组供其他场景使用,可以在遍历的时候加数组赋值逻辑:

var
  CodeArr : TArray<string>;
// 省略其他代码
SetLength(CodeArr, jsa.Size);
for i := 0 to jsa.Size - 1 do
begin
  jso := TJSONObject(jsa.Get(i));
  CodeArr[i] := jso.GetValue<string>('Code', '');
end;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 00:15:07