Как обрабатывать JMESPath содержит фильтр по атрибуту, который может быть нулевым?

Я хочу отфильтровать вывод команды Azure CloudShell az ad sp list, который выводит массив JSON, например, путем фильтрации до Publisher Name =" ACME ". Все команды z поддерживают аргумент --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

Но когда я комбинирую нулевой фильтр с фильтром содержит, я все равно получаю сообщение об ошибке:

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

Я предполагаю, что фильтр JMESPath не поддерживает короткое замыкание логических операций. Однако я не нашел никаких заявлений об этом ни на http://jmespath.org/, и в поиске в Google.

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

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


person JohnC    schedule 22.03.2019    source источник
comment
Ошибка указывает на проблему с синтаксисом запроса jmespath. Он говорит о недопустимом типе значения в функции contains ().   -  person LHWizard    schedule 26.03.2019


Ответы (2)


Контекст

  • Консоль облачной оболочки MSFT azure (по состоянию на 17.11.2019)
  • команды Azure Cloud Shell az с запросом jmespath
  • jmespath обработка потенциально нулевых значений в выражении фильтра

Вариант использования

  • UserJohnCDeveloper хочет запустить фильтр JMESPath для атрибутов, которые могут иметь значение NULL.
  • как выполнить шлейфовое соединение или конвейерную цепочку с предложением Azure az command --query

Решение

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

Пример

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

Для тех, кто ищет более общий подход, используйте || для создания or-выражения:

expression || expression

Ссылка jmespath.org

person t.h3ads    schedule 05.05.2021