【问题标题】:jq filter json by datesjq 按日期过滤 json
【发布时间】:2016-10-05 18:59:43
【问题描述】:

我有一些像这样的 json

 {
  "users":[ {  
     "id":8734,
     "last_login":"2016-10-04T06:59:40Z"
  },
  {  
    "id":9376,
    "last_login":"2016-05-04T20:37:32Z"
  },
  {  
    "id":9376,
    "last_login":null
  }
]}

我想返回最后一次登录日期大于 90 天的 id,所以在这种情况下它应该只返回 9376。我想我需要将 fromdateiso8601 与 select 结合使用,但在语法正确时遇到了一些麻烦。

这似乎有效

.users[] | select ( .last_login | fromdateiso8601 > 1475625600) | .id 

但我还是得到了

jq: error (at <stdin>:0): strptime/1 requires string inputs and arguments

我如何处理空值,理想情况下这些值将包含在结果中。

【问题讨论】:

    标签: json jq


    【解决方案1】:

    只需添加适当的空检查。

    .users[] | select (.last_login | . == null or fromdateiso8601 > 1475625600).id 
    

    【讨论】:

    • 杰夫 - 不应该是and 吗?
    • 其实我的意思是or,但我的第一个条件错了。他提到我们希望将结果包含在 null 值中。
    【解决方案2】:

    防止 .last_login 出现空值的一种方法如下:

    .users[]
    | select ( .last_login // empty | fromdateiso8601 > 1475625600)
    | .id 
    

    不过,为了清楚起见,我会添加括号,例如:

    .users[]
    | select ( (.last_login // empty) | fromdateiso8601 > 1475625600)
    | .id 
    

    或者更多的防守,使用?

    .users[]
    | select ( .last_login | fromdateiso8601? > 1475625600)
    | .id 
    

    如果您想包含 .last_login 评估为 null 的项目,那么您可以使用 Jeff 建议的过滤器,或者:

     (.last_login | fromdateiso8601? > 1475625600) // true
    

    附:对于“距现在 90 天,以 Unix 纪元开始以来的秒数表示”,您可以使用:

    def daysAgo(days):  (now | floor) - (days * 86400);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-19
      • 1970-01-01
      • 2018-09-30
      • 1970-01-01
      • 2018-09-08
      • 2019-03-01
      • 2016-01-10
      • 2018-11-07
      相关资源
      最近更新 更多