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

X-SuperObject误判不存在的键为存在,如何正确检测键是否存在?

XSuperObject中判断键是否存在的问题

我遇到一个问题,以下代码会往Memo1里添加空字符串:

if Assigned(job['Employer.Name.Normalized']) then
   Memo1.Lines.Add('Employer name = ' + job['Employer.Name.Normalized'].AsString);

这其实不难理解,因为对应的JSON结构里根本没有Employer.Name.Normalized这个路径:

{
    "Id": "POS-10",
    "Employer": {
        "Location": {
            "CountryCode": "UK",
            "Municipality": "Bradford"
        }
    },
    "IsSelfEmployed": false,
    "IsCurrent": false
}

但奇怪的是,Assigned(job['Employer.Name.Normalized'])的返回值居然是true。哪怕换成Assigned(job.O['Employer'].O['Name'].O['Normalized'])结果也一样——我原以为这只是语法糖写法。

更离谱的是,我试了一些完全不存在的随机键,比如Assigned(job['StackOverlow'])或者Assigned(job['Why is this not false???']),返回值也全是true。

到底哪里操作错了?怎么才能正确检测ISuperObject里某个键是否真的存在?


原因分析

XSuperObject的索引器(不管是.链式调用还是[]取值)采用了**"惰性创建"**机制——当你访问一个不存在的路径或键时,它不会返回nil,而是自动创建一个空的ISuperObject实例。这就是Assigned()始终返回true的核心原因。

正确检测方式

要判断某个键或路径是否真实存在,不能用Assigned(),推荐用以下几种方法:

1. 逐层检查键是否存在(使用Contains())

// 逐层验证路径上的每个节点是否存在
if job.Contains('Employer') 
   and job.O['Employer'].Contains('Name') 
   and job.O['Employer'].O['Name'].Contains('Normalized') then
  Memo1.Lines.Add('Employer name = ' + job['Employer.Name.Normalized'].AsString);

2. 直接检查完整路径(使用TryGetValue())

这个方法更简洁,直接尝试从指定路径取值,路径不存在时返回false,且不会创建空对象:

var
  normalizedName: string;
begin
  if job.TryGetValue('Employer.Name.Normalized', normalizedName) then
    Memo1.Lines.Add('Employer name = ' + normalizedName);
end;

3. 通过类型判断(使用TypeOf())

不存在的路径对应的对象类型为stNull,可以借此判断:

if job['Employer.Name.Normalized'].TypeOf <> stNull then
  Memo1.Lines.Add('Employer name = ' + job['Employer.Name.Normalized'].AsString);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 16:35:21