如何在PowerShell中遍历多维JSON对象?已尝试Foreach等方法未果
遍历PowerShell中多维嵌套JSON数组的方法
当你用ConvertFrom-Json转换嵌套JSON数组后,得到的是多层嵌套的PowerShell数组对象,直接遍历最外层只会拿到子数组,无法直接获取具体值。下面针对你的两组数据,分别给出固定深度遍历和通用递归遍历的方案:
一、处理固定三层嵌套的第一组数据
第一组JSON是三层嵌套数组(外层数组 → 第二层数组 → 第三层数组 → 具体值),可以通过逐层嵌套foreach或Foreach-Object遍历:
示例代码
# 定义第一组JSON数据 $jsonData1 = @" [ [ [ "test-1234", "2023-07-11T04:00:24+00:00" ] ], [ [ "sb-00091", "2023-07-11T04:00:21+00:00" ] ] ] "@ # 转换为PowerShell对象 $psObj1 = $jsonData1 | ConvertFrom-Json # 逐层遍历提取所有值 foreach ($level1 in $psObj1) { foreach ($level2 in $level1) { foreach ($value in $level2) { # 输出或处理每个具体值 Write-Host "提取到值:$value" } } }
输出结果
提取到值:test-1234 提取到值:2023-07-11T04:00:24+00:00 提取到值:sb-00091 提取到值:2023-07-11T04:00:21+00:00
二、处理深度不固定的第二组数据
第二组JSON包含四层嵌套(比第一组多了一层子数组),固定层数的遍历会失效,推荐用递归函数处理任意深度的嵌套数组:
示例代码
# 定义第二组JSON数据 $jsonData2 = @" [ [ [ "test-999", "2023-07-13T04:00:21+00:00", [ [ "checking" ] ] ] ] ] "@ # 转换为PowerShell对象 $psObj2 = $jsonData2 | ConvertFrom-Json # 递归遍历函数:自动处理任意深度的嵌套数组 function Get-AllNestedValues { param( [Parameter(Mandatory)] $InputObject ) foreach ($element in $InputObject) { # 判断当前元素是否为数组(PowerShell数组或JSON转换后的数组对象) if ($element -is [array] -or ($element.PSObject.Properties.Name -contains 'Count')) { # 递归处理子数组 Get-AllNestedValues -InputObject $element } else { # 输出非数组的具体值 Write-Host "提取到值:$element" } } } # 调用函数遍历第一组数据 Write-Host "`n=== 第一组数据提取结果 ===" Get-AllNestedValues -InputObject $psObj1 # 调用函数遍历第二组数据 Write-Host "`n=== 第二组数据提取结果 ===" Get-AllNestedValues -InputObject $psObj2
输出结果
=== 第一组数据提取结果 === 提取到值:test-1234 提取到值:2023-07-11T04:00:24+00:00 提取到值:sb-00091 提取到值:2023-07-11T04:00:21+00:00 === 第二组数据提取结果 === 提取到值:test-999 提取到值:2023-07-13T04:00:21+00:00 提取到值:checking
关键说明
ConvertFrom-Json会将JSON数组转换为PowerShell的System.Object[]数组,直接遍历最外层只能拿到子数组,必须逐层深入或递归。- 递归函数的核心逻辑是:判断当前元素是否为数组,若是则继续递归,否则输出具体值,适用于所有嵌套深度的JSON数组。
内容的提问来源于stack exchange,提问作者Money Times
相关产品推荐
相关产品推荐

