【问题标题】:jq - select objects with given key namejq - 选择具有给定键名的对象
【发布时间】:2014-04-24 12:10:18
【问题描述】:

我有一个包含多个级别的任意结构,等等。我需要选择所有包含名为updateDate 的键的对象。我如何用 jq 做到这一点?我想出了一种方法,但是当它访问我必须 grep 出来的叶子时,它也会在无效数据类型上产生错误:

jq 'recurse(.[]) | has("updateDate")' | grep -Fv error

我真的不明白如何检查类型或叶子,我怀疑有一种更简单的方法可以实现我想要的?

【问题讨论】:

    标签: json jq


    【解决方案1】:

    在 1.4 中,您可以:

    jq '..|.updateDate?'
    

    如果你被 1.3 卡住了,你可以像这样使用更长的程序:

    jq 'recurse(if type == "array" or type = "object" then .[] else empty end) | if type == "object" then .updateDate else empty end'
    

    【讨论】:

    • 当结构包含数组时会出错。我认为在中间添加|objects| 可以解决问题。
    • 注意如果你想过滤空数组,那么你可以关注stackoverflow.com/a/26196653/308851jq '..|.updateDate?|select(length>0)'
    【解决方案2】:

    接受的答案还会为每个拥有密钥的对象生成null

    对我有用的是:

    jq '..|objects|.updateDate//empty'
    

    .updateDate//empty 部分表示:如果.updateDatenull(或false),则完全跳过它。

    如果您希望您的密钥具有falsenull 的值,这当然行不通。在这种情况下,使用这个:

    jq '..|objects|select(has("updateDate"))|.updateDate'
    

    【讨论】:

      【解决方案3】:

      未测试:jq 'recurse(.[]?) | objects | has("updateDate")' 怎么样?

      【讨论】:

      • 递归(.[]?) |对象 |选择(有(“a”))
      猜你喜欢
      • 2018-09-07
      • 1970-01-01
      • 2023-03-12
      • 2019-08-10
      • 1970-01-01
      • 2015-06-13
      • 1970-01-01
      • 2023-02-25
      • 2021-04-11
      相关资源
      最近更新 更多