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(“操作”)
可以省略。正确,只是为了清楚起见才包括在内