如何解决如果父对象满足条件,则删除其他嵌套对象
我想根据父对象的密钥是否满足给定条件,从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
}
},"3": {
"bar": 0
}
},"C": {
"4": {
"bar": 0
}
}
}
我原以为这样会起作用:
.[][] |= (if .key == ("1","2") then del(.bar) else del(.foo) end)
但是我的条件有问题,我认为它只是到处删除foo
。
解决方法
使用您的方法,您可以编写:
.[] |= 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
可以用来达到相同的效果)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。