簡體   English   中英

將哈希表轉換為 json 后,Powershell 缺少數組

[英]Powershell missing array after conversion hashtable to json

使用 Graph API 和 Intune。 我在我的腳本中創建哈希表並將其轉換為 POST 到 GraphAPI 的 JSON。 但在轉換過程中的一種情況下,我丟失了數組。 因為這個 GraphAPI 不想接受 JSON 並返回錯誤。

轉換正確的情況:

$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 后括號中的差異。 在第一種情況下是 [],但在第二種情況下是 {}。

有人可以告訴我在第二種情況下我缺少什么嗎?

TheoSantiago Squarzon在評論中提供了關鍵提示,但讓我把它拼出來:

為確保您的foreach語句的輸出是一個數組,請將其括在數組子表達式運算符@()中:

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

還要注意簡化的語法自定義對象文字語法( [pscustomobject] @{ ... } )。

@(...)確保返回一個數組(類型為[object[]] ),無論foreach語句輸出多少對象(如果有的話)。

如果沒有@(...) ,收集的輸出的數據類型取決於語句或命令產生的輸出對象的數量

  • 如果沒有輸出對象,則返回特殊的“AutomationNull”值,表示沒有輸出; 這個特殊值在枚舉上下文中表現得像一個空集合,特別是在管道中,在表達式上下文中就像$null - 有關更多信息,請參見此答案 在當前的上下文中,它將被轉換為null JSON 值。

  • 如果有一個輸出對象,它會按原樣收集,就像它本身一樣 - 這就是您所看到的。

  • 只有兩個或更多輸出對象才能得到一個數組(類型為[object[]] )。

注意:上述行為來自 PowerShell 管道 / 其成功輸出流的流式傳輸行為:對象被逐個發出,並且僅在需要收集輸出對象時才需要處理多個對象:請參閱此答案了解更多信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM