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 e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

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