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