由于
.value
是true
,它没有字段message
,我认为.message?
应该被评估为false
。然后应该打印“Y”。你能帮我理解为什么“X”和“Y”都没有打印吗?
$ jq '.value|if .message? then "X" else "Y" end' <<< '{"value":true}'
如何修改代码,使得如果“message”是
.value
的值的字段,则打印“X”,否则打印“Y”?
true
不能有键 message
,因此 .message?
不返回任何内容,并且两个分支都不会被执行。例如,请参阅 为什么 jq modify 和 if-then-else 不起作用
相反,您可以检查以确保
.
是 object
,并使用 if (. | type) == "object" and .message?
检查密钥是否存在。如下所示,仅当 message
键存在时才返回“X”,如果不存在 message
键或者值不是对象,则返回“y”。
$ jq '.value|if (. | type) == "object" and .message? then "X" else "Y" end' <<< '{"value":true}'
"Y"
$ jq '.value|if (. | type) == "object" and .message? then "X" else "Y" end' <<< '{"value":{"message": true}}'
"X"
$ jq '.value|if (. | type) == "object" and .message? then "X" else "Y" end' <<< '{"value":{"notmessage": true}}'
"Y"