如何使用 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)