Как обрабатывать JMESPath содержит фильтр на атрибут, который может быть нулевым? - PullRequest
1 голос
/ 22 марта 2019

Я хочу отфильтровать выходные данные из команды Azure CloudShell az ad sp list , которая выводит массив JSON, например, путем фильтрации по имени издателя = "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"

IЯ уверен в моем синтаксисе 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/ или в Google.

Я не знаю, как подключить цепочку или канал с помощью команды Azure az --query, чтобы применитьдва фильтра по отдельности.

Любое предложение, как добиться моего фильтрованного вывода?

1 Ответ

0 голосов
/ 23 марта 2019

Контекст

  • jmespath-запрос
  • jmespath обработка потенциально нулевых значений в выражении фильтра

Решение

  • Поддержка Jmespath для конвейерных выражений
  • Jmespath поддерживает передачу результата одного выражения другому, хотя и с использованием выражений канала.Это позволяет выполнять запросы произвольной сложности посредством объединения нескольких подвыражений и фильтров.

Пример

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