【问题标题】:How can a sub-object be pruned from a json object using jq?如何使用 jq 从 json 对象中修剪子对象?
【发布时间】:2018-09-26 07:54:31
【问题描述】:

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

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

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

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

返回:

{
  "v": 1
}

有没有办法删除子对象以保留封闭对象:

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

【问题讨论】:

    标签: json edit jq


    【解决方案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)
    

    【讨论】:

      【解决方案2】:

      使用del 操作符删除你想要的节点:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-10-24
        • 2017-12-14
        • 1970-01-01
        • 2017-06-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多