如何在PowerShell中将JSON对象数组转换为指定字段的字符串数组?
PowerShell提取Azure Service Bus命名空间ID数组问题解决
需求背景
需要将JSON对象数组转换为仅包含指定字段值的字符串数组,示例如下:
输入JSON:
[ { "Name":"Name1", "Id": 3433 }, { "Name":"Name2", "Id": 5455 } ]
目标输出:
[ "Name1", "Name2" ]
遇到的问题
处理单个JSON对象时正常,但提取Azure Service Bus命名空间ID时,两段代码均返回数组首个元素而非完整数组:
代码1:
function FindServiceBusNamespaces($ResourceGroup) { $toExecute = "az servicebus namespace list --resource-group ${ResourceGroup}" $response = GetAzResponseObject -Expression "$toExecute" $namespaceArray = @() foreach ($ns in $response) { $namespaceArray += $ns | Select-Object -ExpandProperty id } return $namespaceArray }
代码2:
function FindServiceBusNamespaces($ResourceGroup) { $toExecute = "az servicebus namespace list --resource-group ${ResourceGroup}" $response = GetAzResponseObject -Expression "$toExecute" $namespaceArray = @() foreach ($ns in $response) { $namespaceArray += $ns.id } return $namespaceArray }
解决方案
问题根源
- PowerShell默认会将单元素数组“拆包”为标量值返回,导致看起来只返回了首个元素
- 如果
az命令仅返回一个命名空间,JSON解析后会得到单个对象而非数组,foreach循环仅执行一次,最终数组只有一个元素,返回时被自动拆包
优化后的代码
方式1:直接用管道提取并强制转为数组
function FindServiceBusNamespaces($ResourceGroup) { # 直接调用az命令并解析JSON,避免字符串拼接执行 $response = az servicebus namespace list --resource-group $ResourceGroup | ConvertFrom-Json # 用@()强制包裹结果,确保返回的是数组(即使只有一个元素) return @($response | Select-Object -ExpandProperty id) }
方式2:确保循环处理的是数组
如果必须保留GetAzResponseObject,先将返回值强制转为数组:
function FindServiceBusNamespaces($ResourceGroup) { $toExecute = "az servicebus namespace list --resource-group ${ResourceGroup}" # 强制将响应转为数组,避免单个对象时无法正确循环 $response = @(GetAzResponseObject -Expression "$toExecute") $namespaceArray = @() foreach ($ns in $response) { $namespaceArray += $ns.id } # 同样强制返回数组 return @($namespaceArray) }
额外优化
避免用+=累加数组(频繁操作会导致性能问题),改用管道收集结果:
function FindServiceBusNamespaces($ResourceGroup) { $response = az servicebus namespace list --resource-group $ResourceGroup | ConvertFrom-Json return @($response | ForEach-Object { $_.id }) }
内容的提问来源于stack exchange,提问作者djangofan
相关产品推荐
相关产品推荐

