Json 如何仅在可选属性值存在时对其进行筛选?

Json 如何仅在可选属性值存在时对其进行筛选?,json,key,jq,Json,Key,Jq,我有以下几个例子: {“message”:“hi”} 但也可以采用以下格式: {“消息”:{“操作”:“foo”} 如果message.action甚至存在,我想过滤掉message.action==“foo”的任何记录 如果我使用命令: jq 'select(.message.action? == null or .message.action? != "foo" )' 然后我得到零结果。这似乎是因为一旦你检查了动作,它就会过滤掉任何不是对象的消息,但我仍然希望能够显示{

我有以下几个例子:

{“message”:“hi”}

但也可以采用以下格式:

{“消息”:{“操作”:“foo”}

如果message.action甚至存在,我想过滤掉message.action==“foo”的任何记录

如果我使用命令:

jq 'select(.message.action? == null or .message.action? != "foo" )'

然后我得到零结果。这似乎是因为一旦你检查了动作,它就会过滤掉任何不是对象的消息,但我仍然希望能够显示
{message:“hi”}

检查消息是否指向一个对象,该对象的键action的值改为foo,并对结果进行逻辑补码。多打几封信没什么害处

select(.message | type == "object" and has("action") and .action == "foo" | not)

检查message是否指向具有键action且其值为foo的对象,并对结果进行逻辑补码。多打几封信没什么害处

select(.message | type == "object" and has("action") and .action == "foo" | not)

操作
不存在时,您可以使用替代运算符
/
为其提供默认值(无论是因为缺少该值还是因为该值最初不是对象):


这将接受
{“message”:“hi”}
{“message”:{“action”:“not foo”}
,但不接受
{“message”:{“action”:“foo”}
action
不存在时,可以使用替代运算符
/
action
提供默认值(无论是因为缺少该值还是因为该值首先不是对象):


这将接受
{“message”:“hi”}
{“message”:{“action”:“not foo”}
,但不接受
{“message”:{“action”:“foo”}

谢谢!你能解释一下这一切的含义吗?语法仍然混淆了meIt的字面意思:如果消息是object类型,有一个名为action的键,action的值是foo,没有
| not
部分,
not
返回其输入的相反内容,如true->false,false->true。这些都是wr尽管
已在手册中列出,但有(“操作”)
可以省略。正确,只是为了澄清谢谢!您还可以添加一个解释来说明这一切的意思吗?语法仍然混淆了meIt的字面意思:如果消息是object类型的,并且有一个名为action的键,action的值是foo,而没有
|not
部分,
not
返回其输入的相反部分,like true->false,false->true。这些都写在手册中,但是
和has(“操作”)
可以省略。正确,只是为了清楚起见才包括在内