如何使用jq从JSON文件中完全删除所有空数组
问题原因
你现有的代码仅会过滤数组内部长度为0的元素,不会对遍历后本身变为空的数组节点做删除处理,所以空数组会保留。
解决方案
使用如下jq命令即可彻底删除所有层级的空数组,同时保留其他合法元素:
jq 'walk(if type == "array" then map(select(length > 0? // true)) | select(length > 0) else . end)' 你的JSON文件路径
逻辑说明
walk会递归遍历JSON结构的所有层级节点- 遇到数组类型节点时,先执行
map(select(length > 0? // true))过滤数组内部的空数组、空字符串等长度为0的元素:length > 0?末尾的?是安全运算符,避免数字、布尔值等没有length属性的元素调用length时报错// true表示如果元素本身没有length属性(比如数字、布尔值、null等),则直接保留该元素
- 过滤完内部元素后,通过
select(length > 0)判断当前数组如果本身长度为0,就直接删除该数组节点
效果示例
假设原JSON内容为:
{ "empty_arr": [], "arr1": [1, "", [], [[]], "hello"], "nested": { "inner_empty": [], "arr2": [2, []] } }
执行命令后输出结果为:
{ "arr1": [1, "hello"], "nested": { "arr2": [2] } }
内容的提问来源于stack exchange,提问作者Katja Eichelberger
相关产品推荐
相关产品推荐

