繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM