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

时间:2017-12-11 09:26:01

标签: json jq any

我有这样的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的数组中选择Hash元素,其.auto_scaler_group_options.tags的哈希数组包含包含“:key”键的哈希值< em>包含“fonzi”和一个“:value”键,其值完全 true,然后返回键值{{ 1}}。

在示例中,查询只会返回dns_name

有没有人知道怎么做,如果可能的话,使用jq?

2 个答案:

答案 0 :(得分:3)

简而言之,是的。

长期:

.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的语义,那么您可以轻松自己推送,或者只是升级: - )

答案 1 :(得分:-1)

您可以按数量或方式查找JSON,

  1. 通过检查属性是否存在
  2. 使用[property]语法
  3. 对象语法中的
  4. 'property'
  5. 对于你的情况,这是一个小样本,你可以进一步查询数组并查看

      

    包含“key”键,其值包含EEE和“value”键   其值恰好为FFF

    for(var k=0; k < p['AAA']['BBB'].length;k++){  
       console.log(p['AAA']['BBB'][k]) 
    }
    

    其中p是JSON对象。

    希望有所帮助