将哈希表转换为 json 后 Powershell 缺少数组

Powershell missing array after conversion hashtable to json

使用 Graph API 和 Intune。我在我的脚本中创建散列 table 并将其转换为 JSON,然后 POST 转换为 GraphAPI。 但在转换期间的一种情况下,我丢失了数组。因为这个 GraphAPI 不想接受 JSON 和 returns 错误。

转换正确的情况:

$TargetGroupIDs = @('111', '222')
$AppAssignment = @{
  mobileAppAssignments = @{
  }
}

$AppAssignment.mobileAppAssignments = foreach ($GroupID in $TargetGroupIDs) {
  $Hash = [ordered]@{
    "@odata.type" = "#microsoft.graph.mobileAppAssignment"
    intent        = "Required"
    settings      = $null
    target        = @{
      "@odata.type" = "#microsoft.graph.groupAssignmentTarget"
      groupId       = "$GroupID"
    }
  }
  write-output (New-Object -Typename PSObject -Property $hash)
}

$AppAssignment | ConvertTo-Json -Depth 50

输出:

{
  "mobileAppAssignments": [
    {
      "@odata.type": "#microsoft.graph.mobileAppAssignment",
      "intent": "Required",
      "settings": null,
      "target": {
        "groupId": "111",
        "@odata.type": "#microsoft.graph.groupAssignmentTarget"
      }
    },
    {
      "@odata.type": "#microsoft.graph.mobileAppAssignment",
      "intent": "Required",
      "settings": null,
      "target": {
        "groupId": "222",
        "@odata.type": "#microsoft.graph.groupAssignmentTarget"
      }
    }
  ]
}

但是当我在 $TargetGroupIDs 中有一个元素时,转换不正确:

$TargetGroupIDs = @('111')
$AppAssignment = @{
  mobileAppAssignments = @{
  }
}

$AppAssignment.mobileAppAssignments = foreach ($GroupID in $TargetGroupIDs) {
  $Hash = [ordered]@{
    "@odata.type" = "#microsoft.graph.mobileAppAssignment"
    intent        = "Required"
    settings      = $null
    target        = @{
      "@odata.type" = "#microsoft.graph.groupAssignmentTarget"
      groupId       = "$GroupID"
    }
  }
  write-output (New-Object -Typename PSObject -Property $hash)
}

$AppAssignment | ConvertTo-Json -Depth 50

输出:

{
  "mobileAppAssignments": {
    "@odata.type": "#microsoft.graph.mobileAppAssignment",
    "intent": "Required",
    "settings": null,
    "target": {
      "groupId": "111",
      "@odata.type": "#microsoft.graph.groupAssignmentTarget"
    }
  }
}

请注意 mobileAppAssignments 后面括号中的区别。在第一种情况下 [],但在第二种情况下 {}.

有人能告诉我在第二种情况下我遗漏了什么吗?

Theo and Santiago Squarzon 在评论中提供了关键提示,但让我把它拼出来:

确保您的 foreach statement is an array, enclose it in @(), the array-subexpression operator:

的输出
$AppAssignment.mobileAppAssignments = @(
  foreach ($GroupID in $TargetGroupIDs) {
    [pscustomobject] @{
      "@odata.type" = "#microsoft.graph.mobileAppAssignment"
      intent        = "Required"
      settings      = $null
      target        = @{
        "@odata.type" = "#microsoft.graph.groupAssignmentTarget"
        groupId       = "$GroupID"
      }
    }
  }
)

另请注意简化语法 custom-object 文字语法 ([pscustomobject] @{ ... }).

@(...) 确保返回一个 array[object[]] 类型),无论有多少对象(如果有的话),foreach 语句输出。

没有@(...),采集输出的数据类型取决于输出对象的数量 由语句或命令产生:

  • 如果有no输出对象,则返回特殊的“AutomationNull”值,表示没有输出;这个特殊值在枚举上下文中表现得像 空集合 ,特别是在管道中,在表达式上下文中表现得像 $null - 请参阅 了解更多信息;在手头的上下文中,它将转换为 null JSON 值。

  • 如果有一个输出对象,它被收集as-is,作为它本身-this就是你看到的。

  • 只有 两个或更多 输出对象你才能得到一个 array (类型 [object[]] ).

注意:上面的行为来自PowerShell管道的streaming行为/它的成功输出流:对象被发射一个接一个,并且需要处理多个对象只有在需要收集输出时才会发挥作用对象:有关详细信息,请参阅