json - 如果父级满足条件,则删除不同的嵌套对象
问题描述
我想根据父对象的键是否满足给定条件,从 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
到处删除。
解决方案
使用您的方法,您可以编写:
.[] |= 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
可以用来实现相同的效果)。
推荐阅读
- encryption - Jdk11 支持哪些 Cipher Suites 算法,哪一个最适合与 TLSv1.2 一起使用
- dart - Flutter/dart 中的 widget.something 实际调用了什么?
- amazon-web-services - 使用 SQS 模拟 SNS 中的消息持久性
- flutter - 应用程序在启动时因 firebase_admob 依赖项 0.8.0+4 而崩溃
- javascript - 根据查询结果循环,将 id 放在输入上并在 td 内选择标签
- node.js - 如何使用 javascript、mocha 和 jasmine 在 vs 代码中运行 botium 测试
- javascript - 如何修复 'TypeError: Cannot read property 'keycloak-token' of undefined' javascript中的错误?
- python - 从 df 的子集中删除某些行
- memory-management - FORTRAN 和 MPI:使用输入文件分配和初始化用户定义类型的数组
- sql - 需要修改查询而不使用交叉/外部应用