![](/img/trans.png)
[英]Parse 2 files based on key value and recreate another json file [JQ]
[英]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.