JQ:过滤键

问题描述 投票:0回答:1

我正在尝试使用 JQ 命令来过滤 json 对象以有选择地提取密钥。 这是我放置在文件 x.txt 中的示例对象:

{
  "activities" : {

    "-KSndgjqvmQkWVKHCpLh" : {
      "create_device" : "...",
      "stop_time_utc" : "2016-11-01T23:08:08Z"
    },

    "-KSoBSrBh6PZcjRocGD7" : {
      "create_device" : "..."
    },

    "-KSptboGjo8g4bieUbGM" : {
      "create_device" : "...",
      "stop_time_utc" : "2017-01-17T23:08:08Z"
    }

  }
}

以下命令可以提取所有活动密钥:

cat x.txt | jq '.activities | keys'
[
  "-KSndgjqvmQkWVKHCpLh",
  "-KSoBSrBh6PZcjRocGD7",
  "-KSptboGjo8g4bieUbGM"
]

我已经用谷歌搜索和试验了几个小时,试图过滤对象以仅选择具有 stop_time_utc 值的活动条目,并使用类似“select(.stop_time_utc | fromdateiso8601 > now)”之类的内容来仅选择具有 stop_time_utc 值的活动条目已过期。例如,我想使用过滤器从示例对象创建一个数组,仅包含一个相关条目:

[
  "-KSndgjqvmQkWVKHCpLh"
]

使用按键选项尝试此操作是否是错误的路线? 任何想法或建议将不胜感激。

json key filtering jq
1个回答
30
投票

函数

with_entries(f)
是你的朋友,例如:

.activities | with_entries( select(.value | has("stop_time_utc") ) )

产生:

{
  "-KSndgjqvmQkWVKHCpLh": {
    "create_device": "...",
    "stop_time_utc": "2016-11-01T23:08:08Z"
  },
  "-KSptboGjo8g4bieUbGM": {
    "create_device": "...",
    "stop_time_utc": "2017-01-17T23:08:08Z"
  }

现在可以轻松添加额外的选择标准、提取感兴趣的键名称等。例如:

.activities
| with_entries( select( (.value.stop_time_utc? | fromdateiso8601?) < now ) )
| keys
© www.soinside.com 2019 - 2024. All rights reserved.