[英]Selecting from complex nested JSON data in JQ
我有这样的JSON数据:
{
"profiles": {
"auto_scaler": [
{
"auto_scaler_group_name": "myasg0",
"auto_scaler_group_options": {
":availability_zones": ["1a", "1b", "1c"],
":max_size": 1,
":min_size": 1,
":subnets": ["a", "b", "c"],
":tags": [
{":key": "Name", ":value": "app0" },
{":key": "env", ":value": "dev" },
{":key": "role", ":value": "app" },
{":key": "domain", ":value": "example.com" },
{":key": "fonzi_app", ":value": "true"},
{":key": "vpc", ":value": "nonprod"}
]
},
"dns_name": "fonz1"
},
{
"auto_scaler_group_name": "myasg1",
"auto_scaler_group_options": {
":availability_zones": ["1a", "1b", "1c"],
":max_size": 1,
":min_size": 1,
":subnets": ["a", "b", "c"],
":tags": [
{":key": "Name", ":value": "app1" },
{":key": "env", ":value": "dev" },
{":key": "role", ":value": "app" },
{":key": "domain", ":value": "example.com" },
{":key": "bozo_app", ":value": "true"},
{":key": "vpc", ":value": "nonprod"}
]
},
"dns_name": "bozo1"
}
]
}
}
我想编写一个jq查询,首先在.profiles.auto_scaler
的Array中选择其Hash元素,其在.auto_scaler_group_options.tags
的hash数组包含的哈希表包含一个“ :key
”键,其值包含 “ fonzi
”和一个“ :value
值完全 true
的密钥,然后返回密钥dns_name
的值。
在该示例中,查询将仅返回"fonz1"
。
有谁知道如何使用jq做到这一点?
简而言之,是的。
总而言之:
.profiles.auto_scaler[]
| .dns_name as $name
| .auto_scaler_group_options
| select( any(.[":tags"][];
(.[":key"] | index("fonzi")) and (.[":value"] == "true")) )
| $name
上面的输出是:
"fonz1"
这里的技巧是在更深入地研究“复杂的嵌套JSON”之前提取候选.dns_name。
如果您的jq没有any
,您可以(在这种情况下)通过将上面的select
表达式替换为:
select( .[":tags"][]
| (.[":key"] | index("fonzi")) and (.[":value"] == "true") )
但是请注意,两个表达式的语义略有不同。 (家庭作业:有什么区别?)
如果您的jq没有any
,并且您想要any
语义,那么您可以轻松地自己滚动或简单地升级:-)
您可以通过多种方式查询JSON,
对于您的情况,这是一个小样本,此外,您可以在数组上查找并查看
包含一个其值包含EEE的“键”键和一个其值正好为FFF的“值”键
for(var k=0; k < p['AAA']['BBB'].length;k++){
console.log(p['AAA']['BBB'][k])
}
其中p是JSON对象。
希望能有所帮助
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.