簡體   English   中英

使用 jq 根據位於 json 文件深處的鍵搜索值

[英]Using jq to search for a value based on a key located deep in json file

我是 jq 的新手,我正在嘗試使用它根據位於 json 結構深處的鍵在 json 文件中搜索值。 這是我的 json 文件的示例:

{
  "data": {
    "inventory": {
      "location": "remote",
      "list": {
        "content": [
          {
            "item": {
              "name": "minivan"
            },
            "owner": {
              "id": "12345",
              "state": "CA"
            }
          },
          {
            "item": {
              "name": "sedan"
            },
            "owner": {
              "id": "67890",
              "state": "AZ"
            }
          }
        ]
      }
    }
  }
}

我嘗試做的搜索示例是:

select item.name where owner.id = "67890"

預期的 output 將是:

item.name = "sedan"

我正在嘗試運行以下命令:

jq '.[] | select .owner.id = "67890" | .item.name' json

它會產生一個錯誤:

jq: error: select/0 is not defined at <top-level>, line 1:
.[] | select .owner.id = "67890" | .item.name      
jq: 1 compile error

非常感謝任何有關如何在 jq 中執行此操作的指示! 謝謝!

首先,您必須“導航”到要進行查詢的位置。 這似乎是一個數組。

.data.inventory.list.content
[
  {
    "item": {
      "name": "minivan"
    },
    "owner": {
      "id": "12345",
      "state": "CA"
    }
  },
  {
    "item": {
      "name": "sedan"
    },
    "owner": {
      "id": "67890",
      "state": "AZ"
    }
  }
]

演示

接下來,讓我們迭代該數組的項目,這為我們提供了 stream 個對象。

.[]
{
  "item": {
    "name": "minivan"
  },
  "owner": {
    "id": "12345",
    "state": "CA"
  }
}
{
  "item": {
    "name": "sedan"
  },
  "owner": {
    "id": "67890",
    "state": "AZ"
  }
}

演示

從這些對象中,我們 select 符合您的標准。

select(.owner.id == "67890")
{
  "item": {
    "name": "sedan"
  },
  "owner": {
    "id": "67890",
    "state": "AZ"
  }
}

演示

最后,我們提取您感興趣的值。

.item.name
"sedan"

演示

jq 調用中組合的所有內容將是:

jq '.data.inventory.list.content[] | select(.owner.id == "67890").item.name'
"sedan"

演示

這個 output 仍然是有效的 JSON 文檔(只包含一個 JSON 字符串)。 如果要將 output 作為原始文本處理,請使用--raw-output (或-r )選項:

jq -r '.data.inventory.list.content[] | select(.owner.id == "67890").item.name'
sedan

演示

這是一個避免必須“導航”到正確位置的解決方案,並且它也非常接近您的類似 SQL 的查詢:

..
| objects 
| select(.owner and 
         (.owner|type=="object" and .id == "67890"))
  .item.name

或更簡潔:

..|objects|select(.owner.id? == "67890").item.name

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM