如何使用 jq 从 json 对象中删除子对象?
How can a sub-object be pruned from a json object using jq?
在下面,我试图删除 "bar" 数组中的两个对象之一,其中 "v" == 2:
{
"foo": {},
"bar": [
{
"v": 2
},
{
"v": 1
}
]
}
我可以先只保留列表,然后删除匹配的对象:
.bar[] | select(.v ==2 | not)
returns:
{
"v": 1
}
有没有办法删除子对象以保留封闭对象:
{
"foo": {},
"bar": [
{
"v": 1
}
]
}
使用del
运算符删除你想要的节点:
<file jq 'del(.bar[] | select(.v==2))'
按照给定的尝试,即:
.bar[] | select(.v ==2 | not)
您将使用 |=
运算符,例如:
.bar |= map(select(.v ==2 | not))
或者简单地说:
.bar |= map(select(.v != 2))
如果只想删除第一个匹配项,可以这样写:
.bar |= (index({v:2}) as $i| .[:$i] + .[$i+1:])
或更稳健:
.bar |= (index({v:2}) as $i
| if $i then .[:$i] + .[$i+1:] else . end)
或者如果您愿意:
.bar |= ( ([.[].v]|index(2)) as $i
| if $i then del(.[$i]) else . end)
在下面,我试图删除 "bar" 数组中的两个对象之一,其中 "v" == 2:
{
"foo": {},
"bar": [
{
"v": 2
},
{
"v": 1
}
]
}
我可以先只保留列表,然后删除匹配的对象:
.bar[] | select(.v ==2 | not)
returns:
{
"v": 1
}
有没有办法删除子对象以保留封闭对象:
{
"foo": {},
"bar": [
{
"v": 1
}
]
}
使用del
运算符删除你想要的节点:
<file jq 'del(.bar[] | select(.v==2))'
按照给定的尝试,即:
.bar[] | select(.v ==2 | not)
您将使用 |=
运算符,例如:
.bar |= map(select(.v ==2 | not))
或者简单地说:
.bar |= map(select(.v != 2))
如果只想删除第一个匹配项,可以这样写:
.bar |= (index({v:2}) as $i| .[:$i] + .[$i+1:])
或更稳健:
.bar |= (index({v:2}) as $i
| if $i then .[:$i] + .[$i+1:] else . end)
或者如果您愿意:
.bar |= ( ([.[].v]|index(2)) as $i
| if $i then del(.[$i]) else . end)