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

如何用SuperObject检测Delphi中嵌套JSON元素的存在性?

SuperObject嵌套JSON元素检测及操作方案

一、解决problems.Diabetes检测不到的问题

检测失败的核心原因大概率是problems为JSON数组而非普通对象,直接用.访问数组元素会无效,必须指定数组索引。以下是两种场景的正确检测方式:

场景1:problems是普通JSON对象

若problems结构为{"problems": {"Diabetes": {...}}},可直接用路径语法或分步访问:

var
  SO: ISuperObject;
begin
  SO := SO('{"problems": {"Diabetes": {"type": "Type2"}}}');
  // 路径语法检测
  if Assigned(SO['problems.Diabetes']) then
    ShowMessage('problems.Diabetes 存在');
  // 分步访问检测
  if Assigned(SO.O['problems']) and Assigned(SO.O['problems'].O['Diabetes']) then
    ShowMessage('problems.Diabetes 存在');
end;

场景2:problems是JSON数组(更常见场景)

若problems结构为{"problems": [{"Diabetes": {...}}]},必须添加数组索引:

var
  SO: ISuperObject;
begin
  SO := SO('{"problems": [{"Diabetes": {"type": "Type2", "associatedDrug": [{"strength": "500mg"}]}}]}');
  // 带索引的路径语法检测
  if Assigned(SO['problems[0].Diabetes']) then
    ShowMessage('problems[0].Diabetes 存在');
  // 分步访问数组元素检测
  if Assigned(SO.A['problems']) and (SO.A['problems'].Length > 0) then
    if Assigned(SO.A['problems'].O[0].O['Diabetes']) then
      ShowMessage('problems[0].Diabetes 存在');
end;

二、后续需求实现示例

1. 更新associatedDrug的strength

// 直接通过路径赋值
SO['problems[0].Diabetes.associatedDrug[0].strength'] := SO('"1000mg"');

// 分步操作(适合复杂路径,更直观)
with SO.A['problems'].O[0].O['Diabetes'].A['associatedDrug'].O[0] do
  S['strength'] := '1000mg';

2. 插入新键值对

给指定节点新增键值对,比如给Diabetes添加status字段:

// 路径方式直接赋值
SO['problems[0].Diabetes.status'] := SO('"controlled"');

// 分步添加
SO.O['problems[0].Diabetes'].S['status'] := 'controlled';

3. 自动扩展嵌套路径

SuperObject支持自动创建不存在的嵌套路径,直接赋值即可完成路径创建:

var
  SO: ISuperObject;
begin
  SO := SO('{"a": {"b": {}}}');
  // 自动创建a.b.c.d[3].e路径并赋值
  SO['a.b.c.d[3].e'] := SO('"new nested value"');
  // 输出格式化后的JSON查看结果
  ShowMessage(SO.AsJSON(true));
end;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 20:05:17