如果没有其他JSON JQ

时间:2015-04-29 16:13:11

标签: json if-statement jq

我使用以下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块中做任何事情。无论如何,我可以忽略其他或只是在其他地方打印一些whitespce。

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

2 个答案:

答案 0 :(得分:32)

您可能想要使用这个成语:

B

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

在你的情况下,你有一个" elif"所以使用"否则为空"可能是您想要的,但作为参考,上述内容完全等同于:

if CONDITION then WHATEVER else empty end

P.S。我的猜测是,无论sed命令的目标是什么,它都可以作为jq程序的一部分更可靠地完成,可能使用empty

更新

在jq 1.6发布之后,进行了更改,以便"如果没有其他"具有"如果_则_ else的语义。结束",即:

select(CONDITION) | WHATEVER === walk/1

答案 1 :(得分:3)

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

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

另一方面,如果使用requests非空,则只是更新resultmap属性。检查没有必要。如果它是空的,那么它将返回空。

您可以将过滤器简化为:

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