PowerShell解析JSON时拼接嵌套tags属性到PSCustomObject的方法
PowerShell 构造PSCustomObject时拼接JSON嵌套标签值方案
失败原因
你直接执行$RoadmapContent.Tags -join ";"未生效的核心原因是:$RoadmapContent.Tags存储的是完整的tag对象数组,而非直接的标签名字符串数组。直接对对象数组执行join操作时,PowerShell会默认调用对象的默认ToString()方法,返回的是对象类型名称而非你需要的tagName属性值,因此结果不符合预期。
可行实现方式
方式1:成员访问枚举(推荐,PowerShell 3.0及以上版本通用,写法最简洁)
PowerShell原生支持对数组直接访问属性,批量提取数组所有元素的指定属性值,直接在PSCustomObject的字段定义中使用即可,无需额外遍历变量:
# 已有的JSON读取逻辑无需修改 $RoadmapContent = Get-Content -Raw -Path ./M365Roadmap_single.json | ConvertFrom-Json $RoadmapItems = [PSCustomObject]@{ # 其余自定义字段按原有业务逻辑填写即可,例如: FeatureId = $RoadmapContent.id FeatureTitle = $RoadmapContent.title ReleaseDate = $RoadmapContent.publicAvailabilityDate # 直接批量提取所有tag的tagName属性后拼接 Tags = $RoadmapContent.tags.tagName -join ", " }
执行后Tags字段输出效果和你预期完全一致:
Microsoft Teams, Worldwide (Standard Multi-Tenant), General Availability, Web, Desktop
如果需要分号分隔,直接将-join ", "修改为-join "; "即可。
方式2:管道遍历兼容低版本
如果使用低于3.0的PowerShell版本,无法使用成员访问枚举特性,可以直接在字段定义中通过管道遍历提取属性值,同样无需提前定义单独变量存储标签列表:
$RoadmapItems = [PSCustomObject]@{ # 其余字段省略 Tags = $RoadmapContent.tags | ForEach-Object { $_.tagName } -join ", " }
注意事项
如果执行后发现Tags字段为空,先检查JSON转换后的属性层级是否正确:部分M365路线图JSON的tags字段是嵌套在features等子节点下,而非根节点,调整对应属性路径即可。
内容的提问来源于stack exchange,提问作者v1ctormoreno
相关产品推荐
相关产品推荐

