我正试图在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))
将删除没有has
和color
的children
,因此输出变为:
[
{
"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><一口>在线演示/一口>一口>