我有一个描述 OPNSense 防火墙配置的 JSON 输出。
我想将输出压缩成更有用的东西。考虑 VLAN 列表的以下元素
[
{
"key": "0eb660b0-555a-469e-be04-8c3584108f9b",
"value": {
"if": {
"igb1": {
"value": "igb1 (64:62:66:22:6e:d0) [UNTAGGED]",
"selected": 0
},
"igb2": {
"value": "igb2 (64:62:66:22:6e:d1) [tagged]",
"selected": 1
}
},
"tag": "20",
"pcp": {
"1": {
"value": "Background (1, lowest)",
"selected": 0
},
"0": {
"value": "Best Effort (0, default)",
"selected": 1
},
"2": {
"value": "Excellent Effort (2)",
"selected": 0
}
},
"proto": {
"": {
"value": "Auto",
"selected": 1
},
"802.1q": {
"value": "802.1Q",
"selected": 0
},
"802.1ad": {
"value": "802.1ad",
"selected": 0
}
},
"descr": "USERS: PCs und Handies ",
"vlanif": "vlan0.20"
}
}
]
我只想查看具有
if
的 pcp
、proto
或 selected ==1
的内容。我是否得到他们的钥匙或他们的价值是另一个问题。结果可能如下所示:
[
{
"key": "0eb660b0-555a-469e-be04-8c3584108f9b",
"value": {
"if": {
"igb2": {
"value": "igb2 (64:62:66:22:6e:d1) [tagged]",
"selected": 1
}
},
"tag": "20",
"pcp": {
"0": {
"value": "Best Effort (0, default)",
"selected": 1
}
},
"proto": {
"": {
"value": "Auto",
"selected": 1
}
},
"descr": "USERS: PCs und Handies ",
"vlanif": "vlan0.20"
}
}
]
参见在线
我尝试了我想到的
select
的所有变体。但我不知道如何选择子属性而不是整个对象。
遍历每个潜在的对象,例如使用
.[].value["if", "pcp", "proto"]
,并通过过滤匹配条件的项目来更新它,在本例中为 .selected == 1
:
.[].value["if", "pcp", "proto"] |= map_values(select(.selected == 1))
[
{
"key": "0eb660b0-555a-469e-be04-8c3584108f9b",
"value": {
"if": {
"igb2": {
"value": "igb2 (64:62:66:22:6e:d1) [tagged]",
"selected": 1
}
},
"tag": "20",
"pcp": {
"0": {
"value": "Best Effort (0, default)",
"selected": 1
}
},
"proto": {
"": {
"value": "Auto",
"selected": 1
}
},
"descr": "USERS: PCs und Handies ",
"vlanif": "vlan0.20"
}
}
]