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

