【问题标题】:JQ object selection without endless filter chains没有无限过滤链的 JQ 对象选择
【发布时间】:2018-05-02 16:21:17
【问题描述】:

我在使用 jq (1.5) 解析深度嵌套的 JSON 结构时遇到了困难,我觉得我用错了。以 JSON 输入为例:

{
 "a":[],
 "b":[
  {"x":"bar", "s":"FX", "f":["blorg","blarg","blurb"], "v":true},
  {"x":"bar", "s":"EX", "f":["blorg","blarg","bloob"], "v":false},
  {"x":"bar", "s":"XT", "f":["blorg","blart","bloop"], "v":true},
  {"x":"bar", "s":"IJ", "f":["blorg","bleep","glarp"], "v":true},
  {"x":"foo", "s":"IX", "f":["porg","parg","pork","peep"], "v":true},
  {"x":"baz", "s":"AB", "f":["zing","zang","zoop"], "v":false}
  ],
 "c":[]
}
  • x 为“bar”的列表b 中提取对象很简单:

    jq '.["b"][] | select(.x == "bar")' < file.json

  • 进一步限制为具有特定值s 的对象也很简单:

    jq '.["b"][] | select(.x == "bar" and .s == "FX")' < file.json

如果我想应用正则表达式测试,或者任何其他需要字符串输入的测试(记住我仍然需要对象输出),我想我别无选择,只能链接过滤器。比如……

  • 为了限制s 以“X”结尾的对象,不幸的是,jq 中没有以下内容:

    jq '.["b"][] | select(.x == "bar" and .s.endswith("X"))' < file.json

    相反,我认为我必须这样做:

    jq '.["b"][] | select(.x == "bar") | select(.s | endswith("X"))' < file.json

  • 类似于s 包含“X”:

    jq '.["b"][] | select(.x == "bar") | select(.s | test("X"))' < file.json

如果我总是使用布尔值ANDs,这很好,但如果我想做OR,该怎么办?例如,jq 程序是什么来获取 x 为“bar”的对象 OR s 以“X”结尾? jq 是否有 |OR| 过滤器?

jq '.["b"][] | select(.x == "bar") |OR| select(.s | endswith("X"))' < file.json

还是我做错了?我是否试图重新发明一些用于选择对象的标准 jq 算法?

【问题讨论】:

    标签: json select jq


    【解决方案1】:

    直截了当(在select 函数中指定所有条件):

    jq -c '.b[] | select(.x == "bar" or (.s | endswith("X")))' file.json
    

    输出:

    {"x":"bar","s":"FX","f":["blorg","blarg","blurb"],"v":true}
    {"x":"bar","s":"EX","f":["blorg","blarg","bloob"],"v":false}
    {"x":"bar","s":"XT","f":["blorg","blart","bloop"],"v":true}
    {"x":"bar","s":"IJ","f":["blorg","bleep","glarp"],"v":true}
    {"x":"foo","s":"IX","f":["porg","parg","pork","peep"],"v":true}
    

    【讨论】:

    • 啊,谢谢。 jq中的小括号是否有特殊含义,还是只是为了将第二个测试与第一个分开?
    • @dg99m,欢迎,我们在这里指定内括号来分隔主管道中的表达式
    猜你喜欢
    • 2021-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-13
    • 2018-12-27
    相关资源
    最近更新 更多