如何使用jq从json对象中修剪子对象?

时间:2018-09-26 07:54:31

标签: json edit jq

在下面,我试图删除“ bar”数组中的两个对象之一,其中一个是“ v” == 2的对象:

{
  "foo": {},
  "bar": [
    {
      "v": 2
    },
    {
      "v": 1
    }
  ]
}

我只能先保留列表,然后删除匹配的对象:

.bar[] | select(.v ==2 | not)

返回:

{
  "v": 1
}

有没有一种方法可以删除子对象以保留封闭的对象:

{
  "foo": {},
  "bar": [
    {
      "v": 1
    }
  ]
}

2 个答案:

答案 0 :(得分:1)

使用del运算符删除所需的节点:

<file jq 'del(.bar[] | select(.v==2))'

答案 1 :(得分:1)

沿着给定尝试的界限,即:

  

.bar [] |选择(.v == 2 |不是)

您将使用|=运算符,例如:

.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)