如何用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
相关产品推荐
相关产品推荐

