使用jq获取特定键值对

isk*_*lue 6 bash json jq

在下面的示例 json 中,我可以使用以下命令过滤费用为空的记录jq -M ' map(select(.charge == null)) '

  [
    {
      "id": 1,
      "name": "vehicleA",
      "state": "available",
      "charge": 100
    },
    {
      "id": 2,
      "name": "vehicleB",
      "state": "available",
    },
    {
      "id": 3,
      "name": "vehicleB",
      "state": "available",
      "charge": 50
    }
  ]
Run Code Online (Sandbox Code Playgroud)

返回:

{
  "id": 2,
  "name": "vehicleB",
  "state": "available",
}
Run Code Online (Sandbox Code Playgroud)

如何仅获取id与过滤记录关联的值id,以便将此步骤添加到上述查询中将返回2

jq1*_*727 6

如果您想要免费项目的 id 数组,您可以使用此过滤器:

.items | map(select(.charge == null) | .id)
Run Code Online (Sandbox Code Playgroud)

访问 jqplay.org 在线尝试

如果您希望枚举值而不是收集到数组中,则更好:

.items[] | select(.charge == null) | .id
Run Code Online (Sandbox Code Playgroud)

访问 jqplay.org 在线尝试


Sto*_*ica 5

你的问题并不完全准确:

  • 示例 JSON 无效,因为第二个对象的最后一个属性有一个尾随逗号,这应该会引发解析错误
  • 的输出map(select(.charge == null))不是示例中的对象,而是单个对象的数组

.id在任何情况下,您都可以从结果中提取map

jq -M 'map(select(.charge == null)) | .[].id' file.json
Run Code Online (Sandbox Code Playgroud)