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

M.R*_*dha 2 select json where-clause jq

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

Run Code Online (Sandbox Code Playgroud)

我尝试做的搜索示例是:

select item.name where owner.id = "67890"
Run Code Online (Sandbox Code Playgroud)

预期输出为:

item.name = "sedan"
Run Code Online (Sandbox Code Playgroud)

我正在尝试运行以下命令:

jq '.[] | select .owner.id = "67890" | .item.name' json
Run Code Online (Sandbox Code Playgroud)

它会产生一个错误:

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

任何有关如何在 jq 中执行此操作的指示将不胜感激!谢谢!

pmf*_*pmf 5

首先,您必须“导航”到要进行查询的位置。这似乎是一个数组。

.data.inventory.list.content
Run Code Online (Sandbox Code Playgroud)
.data.inventory.list.content
Run Code Online (Sandbox Code Playgroud)

演示

接下来,让我们迭代该数组的项目,这为我们提供了一个对象流。

.[]
Run Code Online (Sandbox Code Playgroud)
[
  {
    "item": {
      "name": "minivan"
    },
    "owner": {
      "id": "12345",
      "state": "CA"
    }
  },
  {
    "item": {
      "name": "sedan"
    },
    "owner": {
      "id": "67890",
      "state": "AZ"
    }
  }
]
Run Code Online (Sandbox Code Playgroud)

演示

我们从这些对象中选择符合您标准的对象。

select(.owner.id == "67890")
Run Code Online (Sandbox Code Playgroud)
.[]
Run Code Online (Sandbox Code Playgroud)

演示

最后,我们提取您感兴趣的值。

.item.name
Run Code Online (Sandbox Code Playgroud)
"sedan"
Run Code Online (Sandbox Code Playgroud)

演示

jq 调用中的所有内容组合如下:

{
  "item": {
    "name": "minivan"
  },
  "owner": {
    "id": "12345",
    "state": "CA"
  }
}
{
  "item": {
    "name": "sedan"
  },
  "owner": {
    "id": "67890",
    "state": "AZ"
  }
}
Run Code Online (Sandbox Code Playgroud)
"sedan"
Run Code Online (Sandbox Code Playgroud)

演示

此输出仍然是有效的 JSON 文档(只包含 JSON 字符串)。如果要将输出处理为原始文本,请使用--raw-output(或-r) 选项:

select(.owner.id == "67890")
Run Code Online (Sandbox Code Playgroud)
sedan
Run Code Online (Sandbox Code Playgroud)

演示