如何处理JMESPath包含可能为null的属性的筛选器?

时间:2019-03-22 15:42:16

标签: shell azure null filtering jmespath

我想过滤Azure CloudShell命令az ad sp list的输出,该命令输出JSON数组,例如通过过滤为Publisher Name =“ ACME”。所有az命令都支持--query参数,该参数接受JMESPath。

我有一个JMESPath过滤器:

az ad sp list --query "[?contains(publisherName,'ACME')]" --all

由于错误而失败:

In function contains(), invalid type for value: None, expected one of: ['array', 'string'], received: "null"

我对自己的JMESPath语法充满信心,因为一个非常相似的表达式可以正常工作:

az ad sp list --query "[?contains(displayName,'ACME')]" --all

我有一个可以正常工作的空过滤器:

az ad sp list --query "[?publisherName!='null']" --all

但是当我将null过滤器与contains过滤器结合使用时,仍然会出现错误:

az ad sp list --query "[?publisherName!='null' && contains(publisherName,'ACME')]" --all

我猜测JMESPath过滤器不支持boolean operations short circuit。但是,我没有在http://jmespath.org/上或通过谷歌搜索找到关于此的任何声明。

我不知道如何使用Azure az命令--query子句来菊花链或管道连接以单独应用两个过滤器。

任何建议如何实现我的过滤输出?

2 个答案:

答案 0 :(得分:0)

上下文

  • jmespath查询
  • 在过滤器表达式中
  • jmespath处理可能为空的值

解决方案

  • Jmespath对pipe expressions的支持
  • Jmespath支持通过管道表达式将一个表达式的结果传递给另一个表达式。通过将多个子表达式和过滤器链接在一起,可以实现任意复杂度的查询。

示例

 --query "[? publisherName!='null']|[? contains(publisherName,'ACME')]" --all

答案 1 :(得分:0)

对于那些寻求更通用方法的人,请使用 || 创建 or 表达式:

expression || expression

Ref jmespath.org