为何jn:parse-json与parse-json返回结果不同?如何查看内部表示?
jn:parse-json与parse-json的行为差异解析
执行命令
echo '{"a":null}' | xidel -se ' jn:parse-json($raw)/join((exists(a),a)), parse-json($raw)/join((exists(a),a)) '
输出结果
true null false
问题
已知jn:parse-json是JSONiq扩展,请问两者结果不同的原因是什么?有没有办法查看jn:parse-json($raw)和parse-json($raw)的内部表示,以理解行为差异?
差异原因
jn:parse-json的处理逻辑:它遵循JSONiq规范,会保留JSON中的null值,将其解析为XQuery中专门的空值类型(而非空序列)。因此调用exists(a)时,由于键a明确存在且对应值为null,返回true;同时a会输出null,最终join拼接出true null。parse-json的默认处理逻辑:它将JSON的null转换为XQuery的空序列(empty-sequence())。此时exists(a)检查的是序列是否非空,因为a对应的是空序列,所以返回false;空序列在join中不会产生输出,最终只得到false。
查看内部表示的方法
可以通过xidel的serialize()函数结合XML序列化选项,直观查看两者的内部结构:
- 查看
jn:parse-json的内部表示:
echo '{"a":null}' | xidel -se 'serialize(jn:parse-json($raw), {"method":"xml"})'
- 查看
parse-json的内部表示:
echo '{"a":null}' | xidel -se 'serialize(parse-json($raw), {"method":"xml"})'
序列化后的XML结构会清晰展示:前者的null被保留为特定节点,后者则对应空序列。
内容的提问来源于stack exchange,提问作者Philippe
相关产品推荐
相关产品推荐

