繁体   English   中英

从JQ中的复杂嵌套JSON数据中选择

[英]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,

  1. 通过检查属性是否存在
  2. 通过使用[property]语法,
  3. 对象语法中的“属性”

对于您的情况,这是一个小样本,此外,您可以在数组上查找并查看

包含一个其值包含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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM