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

如何在jq过滤器中排除数组和对象但保留null值?

问题:过滤非对象/数组项时null值意外被排除

我不理解为什么在过滤掉所有对象和数组类型的项时,null值也会被一并排除,目前尚未找到解决方案。

输入文件test.json内容:

$ cat test.json
{
  "object": {
    "key1": 1,
    "key2": null,
    "key3": 3
  },
  "array": [ "a", null, "c" ]
}

实际执行结果(缺失null值):

$ jq '[ paths(select(type | IN("object", "array") | not)) as $path | { "\($path)": getpath($path) } ] | add' test.json
{
  "[\"object\",\"key1\"]": 1,
  "[\"object\",\"key3\"]": 3,
  "[\"array\",0]": "a",
  "[\"array\",2]": "c"
}

期望输出:

{
  "[\"object\",\"key1\"]": 1,
  "[\"object\",\"key2\"]": null,
  "[\"object\",\"key3\"]": 3,
  "[\"array\",0]": "a",
  "[\"array\",1]": null,
  "[\"array\",2]": "c"
}

补充说明:

未应用过滤器时,包含null值的路径会被正常输出:

$ jq '[ paths as $path | { "\($path)": getpath($path) } ] | add' test.json
{
  "[\"object\"]": {
    "key1": 1,
    "key2": null,
    "key3": 3
  },
  "[\"object\",\"key1\"]": 1,
  "[\"object\",\"key2\"]": null,
  "[\"object\",\"key3\"]": 3,
  "[\"array\"]": [
    "a",
    null,
    "c"
  ],
  "[\"array\",0]": "a",
  "[\"array\",1]": null,
  "[\"array\",2]": "c"
}

问题原因

你原命令中的过滤器type | IN("object", "array") | not逻辑上应该包含null(null的type为"null",不属于object或array),但实际执行中null路径被排除,是因为paths(select(...))的写法在处理null值时,上下文判断出现异常。更可靠的方式是直接使用jq内置的scalars类型,它涵盖所有非对象、非数组的类型(包括null、字符串、数字、布尔值),能准确筛选目标路径。

解决方案

使用以下命令即可得到期望输出:

jq '[ paths(scalars) as $path | { "\($path)": getpath($path) } ] | add' test.json

如果需要明确指定类型,也可以用以下写法:

jq '[ paths( . | type | IN("null","string","number","boolean") ) as $path | { "\($path)": getpath($path) } ] | add' test.json

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 11:30:58