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

Dyalog APL:检查JSON是否存在指定字段?问题排查与优化

APL JSON字段存在性检查的异常分析与解决

你尝试检查JSON解析后的命名空间中是否存在s字段,使用以下代码却返回0,但普通字符串数组测试正常返回1:

⍝ Example JSON I'm working with
JSON ← '{"e":"depthUpdate","E":1699599166770,"s":"BTCUSDT","U":40239636237,"u":40239636314,"b":[["36651.78000000","9.81839000"],["36584.34000000","0.00000000"],["36541.21000000","0.00055000"],["36459.23000000","0.00016000"]],"a":[["36651.79000000","0.47428000"],["36690.27000000","0.00000000"],["36690.96000000","0.00000000"],["36691.33000000", "1.40160000"]]}'
(⎕JSON JSON).⎕NL¯2  ⍝ 确认字段存在
┌─┬─┬─┬─┬─┬─┬─┐
│E│U│a│b│e│s│u│
└─┴─┴─┴─┴─┴─┴─┘
1=⍴(⍸'s'∘≡¨(⎕JSON JSON).⎕NL¯2) ⍝ 检查存在性,返回0
0

普通字符串数组测试:

TMP ← 'id' 'result' 's'
TMP
┌──┬──────┬─┐
│id│result│s│
└──┴──────┴─┘
1=⍴(⍸'s'∘≡¨TMP)
1

异常原因

(⎕JSON JSON).⎕NL¯2返回的不是标量字符串数组,而是由单字符向量组成的数组。其中的s是长度为1的字符向量's',而你用来匹配的's'是标量字符串——在APL中,字符向量和标量字符串属于不同类型。

≡是精确匹配运算符,会严格比较类型与值,因此字符向量's'和标量字符串's'不相等,导致's'∘≡¨的结果全为0,⍸返回空集,长度为0,最终1=0返回0。而TMP是标量字符串组成的数组,元素类型与匹配目标一致,所以≡能成功匹配。

解决方法

方法1:使用宽松比较=代替精确匹配≡

=运算符会自动兼容字符向量与标量字符串的比较,只要内容相同就返回1:

1=⍴(⍸'s'∘=¨(⎕JSON JSON).⎕NL¯2)
1

方法2:将字段名列表转换为标量字符串数组

用⊃¨把每个字符向量转换为标量字符串,再用≡匹配:

1=⍴(⍸'s'∘≡¨⊃¨(⎕JSON JSON).⎕NL¯2)
1

更直接的JSON字段存在性检查方式

不用遍历字段列表,直接用⎕NC(Name Class)运算符检查字段是否存在:

10=(⎕JSON JSON)⎕NC's'
1

⎕NC返回值为10时,表示该名称是命名空间的字段(即存在),返回0则表示不存在。


内容的提问来源于stack exchange,提问作者конструктор

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 19:30:34