如何处理Jmespath包含可能为空的属性上的过滤器



我想从Azure Cloudshell命令AZ AD SP列表中过滤输出,该命令输出JSON数组,例如通过过滤到Publisher name =" acme"。所有AZ命令支持一个接受Jmespath表达式的Query参数。

我有一个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

但是,当我将零过滤器与包含过滤器结合时,我仍然会收到错误:

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

我猜测JMESPATH过滤器不支持布尔操作短路。但是,我在http://jmespath.org/或通过搜索搜索中没有找到任何有关该的陈述。

我不知道如何使用Azure AZ命令 - Query子句分别应用两个过滤器。

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

上下文

  • MSFT Azure Cloud Shell Console(截至2019-11-17)
  • Azure Cloud Shell az命令Jmespath查询
  • jmespath在滤波器表达中的潜在无效值

用例

  • 用户Johncdeveloper想要在可能为null的属性上运行Jmespath过滤器
  • 如何使用Azure az command --query子句
  • 如何雏菊链或管道

解决方案

  • Jmespath对管道表达式的支持
  • Jmespath支持将一个表达式的结果传递给另一种表达式,尽管使用管道表达式。这可以通过将多个子表达和过滤器链接在一起来征询任意复杂性的查询。

示例

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

not_null函数很方便。它使查询的目的更加可读。

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

该函数返回第一个非null参数。这通常称为" coalesce"在其他地方。

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

expression || expression

参考Jmespath.org

相关内容

  • 没有找到相关文章

最新更新