jq select 过滤器的意外操作

Unexpected action of jq select filter

我使用 jq 已经有一段时间了,但今天的一些行为让我感到惊讶:

我预计会这样:

 echo '{"Name":"NAME","Tags":[{"Key":"KEY","Value":"HASH"}]}' \
 | jq '{"name": .Name, "hash": (.Tags[]|select(.Key=="hash")|.Value)}'

制作这个:

{
   "name": "NAME",
   "hash": null
}

而是从输出中完全过滤掉整个对象。

作为完整性检查,将过滤器更改为匹配如下的值::

 echo '{"Name":"NAME","Tags":[{"Key":"KEY","Value":"HASH"}]}' \
| jq '{"name": .Name, "hash": (.Tags[]|select(.Key=="KEY")|.Value)}'

产生预期的输出:

{
   "name": "NAME",
   "hash": "HASH"
}

第一种情况 select(.Key=="hash") 的输出令我感到惊讶,因为 select 过滤器旨在作用于 .Tags[] 产生的流而不是整个输入流.

如何表达我想表达的意思,就是如果没有匹配的Tag,输出对象的“hash”属性应该设置为null?

我在 OSX

上使用 jq 1.6

如果过滤器的一部分产生 empty,它会吸取所有与之相关的东西。

解决方法:不要让它产生empty。一种方法是给 select 过滤器一个替代方案:select(.Key=="hash") // null

jq '{"name": .Name, "hash": (.Tags[] | select(.Key=="hash") // null | .Value)}'
{
  "name": "NAME",
  "hash": null
}

Demo