【问题标题】:JSON JQ if without elseJSON JQ 如果没有 else
【发布时间】:2015-07-09 01:27:26
【问题描述】:

我使用以下 JQ 命令过滤掉 JSON。如果存在预期的节点,我的要求是过滤掉 JSON 消息。否则,什么也不做。因此,我使用 if, elif, ....

sed -n "s/.*Service - //p" $1/response.log* |
  jq "if (.requests | length) != 0 then .requests |= map(select(.id == \"123\"))
      elif (.result | length ) != 0  then .result |= map(select(.id== \"123\")) 
      else " "  end" > ~/result.log

看起来 else 在这里是强制性的。我不想在 else 块内做任何事情。无论如何,我可以忽略 else 或者只是在 else 中打印一些 whitespce。

在上述情况下,它会在结果文件中打印双引号“”。

【问题讨论】:

    标签: json if-statement syntax jq


    【解决方案1】:

    由于您没有对对象进行任何进一步更改,因此只需使用“身份”过滤器.

    if (.requests | length) then ... else . end
    

    另一方面,您只是使用map 更新requestsresult 属性(如果非空)。检查是没有必要的。如果为空,则返回空。

    您可以将过滤器简化为:

    .requests |= map(select(.id == \"123\")) | .result |= map(select(.id== \"123\"))
    

    【讨论】:

      【解决方案2】:

      你可能想使用成语:

      if CONDITION then WHATEVER else empty end
      

      empty 是一个不输出任何内容的过滤器——甚至不输出 null,这毕竟是一些东西(即 JSON 值)。它有点像黑洞,只是更黑——它会消耗它所提供的任何东西,但与黑洞不同的是,它甚至不发射霍金辐射。

      在你的情况下,你有一个“elif”,所以使用“else empty”可能是你想要的,但作为参考,上面的内容完全等同于:

      select(CONDITION) | WHATEVER
      

      附:我的猜测是,无论 sed 命令的目标是什么,它都可以作为 jq 程序的一部分更可靠地完成,也许使用walk/1

      更新

      jq 1.6发布后,做了一个改动,使得“if without else”的语义变成了“if _ then _ else .end”,即:

      if P then Q end === if P then Q else . end

      【讨论】:

      • 如何将 if 语句用于类似数组的值。例如: .[]|{result": if (.foo == null) then [ ] end} [{"foo": null , "bar": "不太感兴趣的数据"},{"foo": "null " , "bar": "不那么有趣的数据"}]
      • 请提出一个新的 SO 问题。
      • 擦除任何类型的内存都会产生一些废热。黑洞和 RAM 都是如此。
      • 文档说空:有时很有用。你会知道你是否需要它:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-03
      相关资源
      最近更新 更多