如何检查 jq 中的可选字段?

cod*_*ter 5 jq

我有这个jq过滤器:

some_command | jq -r '.elements[] | select(.state=="LIVE" and .group == "some_text" and .someFlag == false) | .name'
Run Code Online (Sandbox Code Playgroud)

someFlag是可选字段。因此,当它不存在时,表达式不会显示任何结果。我想检查:

  • 如果存在 someFlag,则仅当它具有该false值时才通过检查
  • 如果 someFlag 不存在,则将其视为false

我怎样才能做到这一点?

cod*_*ter 6

我使用了替代运算符//

\n\n
(.someFlag // false) == false)\n
Run Code Online (Sandbox Code Playgroud)\n\n

因此,如果.someFlag不存在,则被视为错误。

\n\n

整个表达式是:

\n\n
some_command | jq -r \'.elements[] | select(.state=="LIVE" and .group == "some_text" and (.someFlag // false) == false)) | .name\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

来自jq文档:

\n\n
\n

替代运算符 // :

\n\n

如果 a 生成除 false 和 null 之外的结果,则该形式的过滤器a // b\n 会生成与 相同的结果。\n 否则,会生成与 相同的结果。aa // bb

\n\n

这对于提供默认值很有用:如果输入中.foo // 1没有元素,则计算结果为 1 。.foo它\xe2\x80\x99s 类似于有时在Python 中使用or 的方式(jq\xe2\x80\x99s 或运算符保留用于严格\n 布尔运算)。

\n
\n

  • 该提案不符合规定的要求,通过考虑如果“someFlag”被指定为“null”会发生什么就可以看出。 (2认同)

pea*_*eak 5

在给定的上下文中,直接翻译为:

  • 如果存在 someFlag,则仅当其值为 false 时才通过检查
  • 如果 someFlag 不存在,则将其视为 false

jq 为:

if has("someflag") then .someflag == false else false end
Run Code Online (Sandbox Code Playgroud)

调节过滤器

.elements[]
| select(.state == "LIVE"
         and .group == "some_text"
         and (if has("someFlag")
              then .someFlag == false 
              else false
              end))
| .name
Run Code Online (Sandbox Code Playgroud)

[此回复已根据问题的更新进行更新。]