При чтении из программы чтения JSON обнаружен неожиданный узел 'PrimitiveValue'. Ожидался узел «StartArray» - PullRequest
1 голос
/ 06 июня 2019

У меня есть приложение Azure AD, в которое мне нужно добавить дополнительное appRole в разделе appRoles субъекта службы с помощью Powershell. Я использую Invoke-RestMethod для API Graph со следующим URL-адресом API: https://graph.microsoft.com/beta/servicePrincipals/AppID

Invoke-RestMethod возвращает PSCustomObject, а затем я добавляю еще один PSCustomObject в раздел appRoles. Затем я преобразовываю объект PSCustomObject в JSON и хочу записать JSON обратно субъекту службы. Проблема в том, что когда я хочу записать JSON обратно в субъект службы, я получаю сообщение об ошибке:

Invoke-RestMethod: удаленный сервер возвратил ошибку: (400) неверный запрос.

Я пытался сделать это также с помощью Проводника графиков, а затем я получаю сообщение об ошибке:

"При чтении из читателя JSON обнаружен неожиданный узел 'PrimitiveValue'. Ожидался узел 'StartArray'."

Я думаю, что та же проблема есть и в C #: Ошибка получения неверного запроса при обновлении категории электронной почты с помощью Office 365 API и HttpClient в C #

Когда я выполняю Get in Graph Explorer, каждое appRole отображается так:

{
  "allowedMemberTypes": [
    "User"
  ],
  "description": "TEST-ALLOWALL",
  "displayName": "TEST-ALLOWALL",
  "id": "00000000-0000-0000-0000-00000000",
  "isEnabled": true,
  "origin": "ServicePrincipal",
  "value": "ARNROLEVALUE"
},

Когда я делаю Invoke-RestMethod, а затем ConvertTo-Json, каждое appRole отображается так:

{
  "allowedMemberTypes":  "User",
  "description":  "TEST-ALLOWALL",
  "displayName":  "TEST-ALLOWALL",
  "id":  "00000000-0000-0000-0000-00000000",
  "isEnabled":  true,
  "origin":  "ServicePrincipal",
  "value":  "ARNROLEVALUE"
},

Как я могу убедиться, что Invoke-RestMethod сохраняет тип значения allowMemberTypes в виде массива / списка типа ["User"] вместо значения "User"?

И как я могу сделать свое собственное значение PSCustomObject allowMembertypes и массив списков, чтобы я мог добавить его к субъекту службы?

Это код, который я использую

$apiUrl = 'https://graph.microsoft.com/beta/servicePrincipals/000000-0000-0000-0000-00000000000'
$Data = Invoke-RestMethod -Headers $graphAPIReqHeader -Uri $apiUrl -Method Get

$obj = New-Object -TypeName PSObject
$obj | Add-Member -MemberType NoteProperty -Name allowedMemberTypes -Value "User"
$obj | Add-Member -MemberType NoteProperty -Name description -Value $RoleName
$obj | Add-Member -MemberType NoteProperty -Name displayName -value $RoleName
$obj | Add-Member -MemberType NoteProperty -Name id -value $Id
$obj | Add-Member -MemberType NoteProperty -Name isEnabled -value "true"
$obj | Add-Member -MemberType NoteProperty -Name origin -value "ServicePrincipal"
$obj | Add-Member -MemberType NoteProperty -Name value -value $Value

$Data.appRoles += $obj
$NewJson = $Data | ConvertTo-Json
$NewData = Invoke-RestMethod -Headers $graphAPIReqHeader -Uri $apiUrl -Body $NewJson -Method Patch -ContentType 'application/json' 

1 Ответ

0 голосов
/ 06 июня 2019
$input = @"
{
  "allowedMemberTypes": [
    "User"
  ],
   "description": "TEST-ALLOWALL",
   "displayName": "TEST-ALLOWALL",
  "id": "00000000-0000-0000-0000-00000000",
  "isEnabled": true,
  "origin": "ServicePrincipal",
  "value": "ARNROLEVALUE"
}
"@

$jObject = $input | convertfrom-json

$psObj = [Pscustomobject] @{
   AllowedMemberTypes = $jObject.allowedMemberTypes 
}
 $psObj.AllowedMemberTypes.Gettype()

$psObj.AllowedMemberTypes.Gettype() показывает, что AllowedMemberTypes имеет тип array.

Вы можете найти код онлайн и поиграть с ним.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...