You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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
}

解决方案

问题根源

  1. PowerShell默认会将单元素数组“拆包”为标量值返回,导致看起来只返回了首个元素
  2. 如果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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 03:33:27