首页 > 解决方案 > 如果父级满足条件,则删除不同的嵌套对象

问题描述

我想根据父对象的键是否满足给定条件,从 json 文件中删除不同的子对象(同时保持原始结构)。

说我有:

{
  "A": {
    "1": {
      "bar": 1,
      "foo": 0
    }
  },
  "B": {
    "2": {
      "not_here": 0,
      "foo": 0
    },
    "3": {
      "bar": 0,
      "foo": 1
    }
  },
  "C": {
    "4": {
      "bar": 0,
      "foo": 1
    }
  }
}

对于所有在 ["1", "2"] 中具有键的嵌套对象,我想删除该bar对象,否则我想删除该foo对象,因此预期的输出为:

{
  "A": {
    "1": {
      "foo": 0
    }
  },
  "B": {
    "2": {
      "not_here": 0,
      "foo": 0
    },
    "3": {
      "bar": 0
    }
  },
  "C": {
    "4": {
      "bar": 0
    }
  }
}

我原以为这会起作用:

.[][] |= (if .key == ("1", "2") then del(.bar) else del(.foo) end)

但是我认为我的条件有问题,因为它只是foo到处删除。

标签: jsonselectkeyjq

解决方案


使用您的方法,您可以编写:

.[] |= with_entries(
   if (.key == "1" or .key == "2") 
   then .value |= del(.bar) 
   else .value |= del(.foo)
   end)

with_entries可以轻松访问每个“键”和相应的“值”。

您的尝试失败.[][]了,因为您对数据的了解太深,您可以通过运行jq '.[][]'. 如果你这样做了,你就会明白为什么你的尝试最终会foo无条件地删除键,关键是 .key 只是在上下文中为你定义的with_entries(尽管to_entries可以用来实现相同的效果)。


推荐阅读