JQ:过滤键

Posted

技术标签:

【中文标题】JQ:过滤键【英文标题】:JQ: Filtering for keys 【发布时间】:2017-04-16 20:27:37 【问题描述】:

我正在尝试使用 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】:

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

【讨论】:

感谢 @peak 提供指向 with_entries 的指针!这是我现在用来提取过期活动名称的完整命令:jq '.activities | with_entries(select(.value | has("stop_time_utc") ) ) | with_entries(select(.value.stop_time_utc | fromdateiso8601?

以上是关于JQ:过滤键的主要内容,如果未能解决你的问题,请参考以下文章

仅从 jq 中的外部文件中过滤特定键

如何删除除 jq 之外的所有键?

如何使用 jq 按元素属性值过滤对象数组?

在 Python 中通过 jq 从 API 过滤 JSON

jq - 在多个级别上应用过滤器

jq 过滤内部数组元素但返回整个 JSON