Powershell – ConvertTo-JSON głębokość konwersji

Powershell – ConvertTo-JSON głębokość konwersji

W świecie, gdzie większość nowoczesnych usług obsługiwana jest przez API nie sposób nie korzystać z automatyzacji Powershell wykorzystującej format wymiany danych jakim jest JSON. Ma on jednak w przypadku konwersji w Powershellu jedną dosyć uciążliwą przypadłość – mianowicie głębokość konwersji.

Na przykładzie poprzedniego wpisu: https://mkrzanowicz.pl/zarzadzanie-lista-domen-b2b-w-azure-active-directory/ zobaczmy jak wygląda format danych przy standardowej konwersji do JSON:

Przy próbie przekazania takiego JSON’a do Azure otrzymamy błąd:

Set-AzureADPolicy : Error occurred while executing SetPolicy
Code: Request_BadRequest
Message: Property definition has an invalid value.
InnerError:
  RequestId: d5ee8fad-7e5b-4538-b5ce-3972b7ca5951
  DateTimeStamp: Sun, 07 Feb 2021 14:17:58 GMT
HttpStatusCode: BadRequest
HttpStatusDescription: Bad Request
HttpResponseStatus: Completed
At line:1 char:1
+ Set-AzureADPolicy -Id $policy.id -Definition $($JSON | ConvertTo-Json ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Set-AzureADPolicy], ApiException
    + FullyQualifiedErrorId : Microsoft.Open.MSGraphBeta.Client.ApiException,Microsoft.Open.MSGraphBeta.PowerShell.SetPolicy

Szybki rzut oka na dokumentację: https://docs.microsoft.com/en-us/azure/active-directory/external-identities/allow-deny-list wskazuje, że lista domen w poleceniu ma być przekazywana jako obiekt a więc w notacji „[ mkrzanowicz.pl ]” – natomiast domyślna konwersja z Powershella spowodowała pominięcie tablicy obiektów.

Tutaj rodzi się pytanie – dlaczego? Przecież pracowaliśmy cały czas na danych pobranych jako JSON, których wartości modyfikowaliśmy ale nie została zmieniona ich struktura. Co więc stało, że po konwersji „nie działa” zgodnie z oczekiwaniami? Otóż odpowiedź znowu można znaleźć w dokumentacji – tym razem samej konwersji w Powershellu: https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/convertto-json?view=powershell-7.1
Domyślnie głębokość konwersji to tylko 2 poziomy w dół… Co w opisywanym przypadku spowodowało ucięcie tablicy obiektów z wynikowego JSON’a.

Wystarczy dodać wyższą wartość dla głębokości konwersji i całość działa zgodnie z oczkowaniami:

A Azure poprawnie przyjmuje polecenie:

Enjoy! 🙂

P.S. Bieżąca maksymalna wartość dla parametru głębokości konwersji to 100. Polecam używać domyślnie przy stosowaniu konwersji aby uniknąć tracenia czasu na niepotrzebne debugowanie błędów.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Wymagane pola są oznaczone *

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.