在树内深度过滤

  • 本文关键字:过滤 深度 json jq
  • 更新时间 :
  • 英文 :


我正试图在JSON结构中深入修剪节点,我很困惑为什么empty的行为似乎与这里的正常值不同。

输入

[
{
"name": "foo",
"children": [{
"name": "foo.0",
"color": "red"
}]
},
{
"name": "bar",
"children": [{
"name": "bar.0",
"color": "green"
},
{
"name": "bar.1"
}]
},
{
"name": "baz",
"children": [{
"name": "baz.0"
},
{
"name": "baz.1"
}]
}
]
<标题>

程序jq '(.[].children|.[])|=if has("color") then . else empty end' foo.json

<标题>

实际产出h1> 期输出我得到的输出,除了没有baz.1子,因为它没有颜色。

<标题>

除了正确的解决方案,我也很好奇为什么用42这样的常规值替换脚本中的empty会像预期的那样用42替换没有颜色的孩子,但是当用empty替换时,看起来else分支不会被执行?

.[].children |= map(select(.color))

将删除没有hascolorchildren,因此输出变为:

[
{
"name": "foo",
"children": [
{
"name": "foo.0",
"color": "red"
}
]
},
{
"name": "bar",
"children": [
{
"name": "bar.0",
"color": "green"
}
]
},
{
"name": "baz",
"children": []
}
]
在线演示

关于为什么你的过滤器似乎不喜欢empty;
这个git问题似乎是原因,empty的多个元素将失败。

empty分配给多个路径时一定存在bug。

在这种情况下,你可以使用del:

del(.[].children[] | select(has("color") | not))
<<p><一口>在线演示/一口>

最新更新