Delphi从JSON数组提取Code字段生成数组并检索匹配值的实现方法
问题原因分析
你现有代码功能失效主要是以下几个错误导致的:
- 逻辑判断错误:你遍历JSON数组拿到的
jso是每条完整的人员信息对象,jso.ToString会输出整段对象JSON字符串,永远不可能等于'Code',这行错误判断直接拦截了所有后续匹配逻辑 - 取值格式错误:直接调用
ToString获取Code值会自带引号,比如实际拿到的是"31212",和Edit控件输入的无引号纯字符串对比永远不匹配 - 异常吞错:你所有的异常捕获都没有任何提示逻辑,接口请求失败、JSON解析失败时你看不到任何报错,无法定位根因
实现方案说明
两种实现方式都可行,根据使用场景选择即可:
- 单次查找:直接遍历JSON数组匹配目标Code即可,不需要额外存储数组,性能足够满足需求
- 多次高频查找:可以提前提取所有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
相关产品推荐
相关产品推荐

