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

为何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序列化选项,直观查看两者的内部结构:

  1. 查看jn:parse-json的内部表示:
echo '{"a":null}' | xidel -se 'serialize(jn:parse-json($raw), {"method":"xml"})'
  1. 查看parse-json的内部表示:
echo '{"a":null}' | xidel -se 'serialize(parse-json($raw), {"method":"xml"})'

序列化后的XML结构会清晰展示:前者的null被保留为特定节点,后者则对应空序列。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 20:02:33