如何在PowerShell中遍历JSON数组及转PSCustomObject后的JSON数组?
嘿,针对你提出的两个PowerShell遍历JSON数组的问题,我来给你详细解答:
1. 如何在PowerShell中遍历JSON数组?
其实流程很清晰,先把JSON字符串转换成PowerShell能处理的对象,接着直接用foreach循环遍历就行。给你举个实际可运行的例子:
# 定义一个JSON数组字符串 $jsonStr = @" [ {"Name": "Alice", "Age": 30}, {"Name": "Bob", "Age": 25}, {"Name": "Charlie", "Age": 35} ] "@ # 将JSON转换为PowerShell对象数组 $jsonArray = ConvertFrom-Json $jsonStr # 遍历数组中的每个元素,输出属性 foreach ($item in $jsonArray) { Write-Host "姓名: $($item.Name), 年龄: $($item.Age)" }
运行这段代码,就能逐个输出数组里每个对象的具体属性了。
2. 遍历ConvertFrom-JSON转换的PSCustomObject数组时foreach无效,仅返回枚举器的问题
你碰到的这个问题,大概率是PowerShell的自动类型推断在搞鬼——有时候ConvertFrom-Json返回的对象看起来是数组,但实际是单个PSCustomObject(比如JSON数组结构特殊,或者不同PowerShell版本的处理差异),或者返回的是实现了IEnumerable的集合,直接遍历会返回枚举器而非数组元素。
解决方法很简单,用@()运算符把转换后的结果强制转换成PowerShell数组,就能正常用foreach遍历了:
# 示例JSON数组 $jsonStr = @" [ {"Name": "Alice", "Age": 30}, {"Name": "Bob", "Age": 25}, {"Name": "Charlie", "Age": 35} ] "@ # 强制转换为数组,规避类型问题 $jsonArray = @(ConvertFrom-Json $jsonStr) # 现在遍历就完全正常了 foreach ($item in $jsonArray) { Write-Host "姓名: $($item.Name), 年龄: $($item.Age)" }
另外,你可以用$jsonArray.GetType()查看对象类型,如果显示是System.Management.Automation.PSCustomObject而非数组类型,那强制转数组就是最直接的解决方案。
还有一种可能是你不小心调用了GetEnumerator()方法,比如错误写法:
# 错误示例:遍历了枚举器而非数组元素 foreach ($item in $jsonArray.GetEnumerator()) { # 这里只会返回枚举器的属性,不是你要的数组内容 }
只要去掉GetEnumerator(),直接遍历$jsonArray就可以解决。
内容的提问来源于stack exchange,提问作者Gregory Suvalian
相关产品推荐
相关产品推荐

