[英]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 后括號中的差異。 在第一種情況下是 [],但在第二種情況下是 {}。
有人可以告訴我在第二種情況下我缺少什么嗎?
Theo和Santiago 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.