使用 jq 根据位于 json 文件深处的键搜索值



我是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"

预期输出为:

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"
}
}
]

演示

接下来,让我们遍历该数组的项,这为我们提供了对象流。

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

演示

从这些对象中,我们选择符合您条件的对象。

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"

演示

此输出仍然是有效的 JSON 文档(仅包含 JSON 字符串)。如果要将输出作为原始文本处理,请使用--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

最新更新