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,提问作者конструктор
相关产品推荐
相关产品推荐

