如何在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
相关产品推荐
相关产品推荐

