簡體   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