JQ:过滤密钥

时间:2016-12-02 01:55:08

标签: json key filtering jq

我正在尝试使用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)”之类的内容选择已过期的活动。例如,我想使用过滤器从样本对象创建一个只有一个相关条目的数组:

[
  "-KSndgjqvmQkWVKHCpLh"
]

使用keys选项尝试使用错误的路径吗?任何想法或建议将不胜感激。

谢谢

1 个答案:

答案 0 :(得分:3)

with_entries/1是你的朋友,例如:

.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