【问题标题】:How can I use a relative Path or a Wildcard in JQ如何在 JQ 中使用相对路径或通配符
【发布时间】:2014-09-11 06:44:02
【问题描述】:

是否可以在 JQ 中使用相对路径或名称,例如 XPath // ?

或者是否可以在 JQ 中使用通配符,例如 .level1.*.level3.element ?

【问题讨论】:

    标签: jq json-path-expression


    【解决方案1】:

    这就是.. 过滤器所要表达的意思。用法如下所示:

    .level1 | .. | .level3? .element
    

    注意:你必须使用? 否则你会得到错误,因为它会递归不具有相应属性的对象。

    【讨论】:

    • 感谢您的回答,我会测试它。问号只是一个问号而不是通配符 :-)
    • “通配符”部分是..,而不是?? 只是在尝试访问 level3 属性时忽略错误。
    【解决方案2】:

    与杰夫的回答相关的两点:

    (1) 使用? 的替代方法是使用objects,例如

    .level1 | .. | objects | .level3.element
    

    (2) 通常人们会想要消除与指定的尾随键不匹配的路径对应的空值。要消除所有空值,一种选择是添加过滤器:select(. != null)。

    另一方面,如果想要保留作为值出现的空值,那么一种可能性是使用paths,如下所示:

    .level1
    | (paths | select( .[-2:] == ["level3", "element"])) as $path
    | getpath($path)
    

    (由于paths产生一个字符串数组流,上面的表达式产生一个对应于以.level3.element结尾的路径的值流)

    等效但作为单行:

    .level1 | getpath(paths | select(.[-2:] == ["level3","element"]))
    

    【讨论】:

    • 感谢消除空值的方法:.level1 | .. | objects | .level3.element | select(. != null)
    • 我在 jq 命令中尝试了相同的操作,但没有收到任何错误或输出。你能告诉我这里做错了什么吗? jq --slurpfile newval auth.json '.paths | .. | objects | .get.parameters += $newval' test.json > test1.json
    猜你喜欢
    • 2012-01-20
    • 1970-01-01
    • 2016-11-09
    • 1970-01-01
    • 1970-01-01
    • 2021-10-20
    • 2016-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多