循环通过多个维度的json对象的powershell

eoxn13cs  于 2023-08-08  发布在  Shell
关注(0)|答案(2)|浏览(103)

我已经检查了foreach和foreach-object,但是即使使用convertFrom-json也无法迭代出它的任何值,所以我对这一部分有点一窍不通--你知道如何迭代它的每个单元格吗?我试过下面的方法,但没有成功。
foreach($data中的$sublist){ foreach($sublist中的$item){写入主机(“值为:“+$item)} }

[
    [
        [
            "test-1234",
            "2023-07-11T04:00:24+00:00"
        ]
    ],
    [
        [
            "sb-00091",
            "2023-07-11T04:00:21+00:00"
        ]
    ]
]

字符串
我想迭代并获得Timestamp的相应值,即对于test-1234,其值为2023-07- 11 T04:00:24+00:00,那么我应该如何更新循环

a                            b
test-1234                  2023-07-11T04:00:24+00:00
sb-00091                   2023-07-11T04:00:21+00:00


如果我能浏览一下的话,有没有什么书或在线文章
如果我有下面的数据结构,那么我应该如何迭代

[
        [
            "test-1234",
            "2023-07-17T04:00:18+00:00",
            {
                "Code": 8,
                "Name": "running"
            }
        ]
    ],
    [
        [
            "sb-00091",
            "2023-07-17T04:00:16+00:00",
            {
                "Code": 16,
                "Name": "running"
            }
        ]
    ]
]


输出应该是这样

a                 b                            c            d
test-1234       2023-07-11T04:00:24+00:00      8          running
sb-00091        2023-07-11T04:00:21+00:00     16          running

bis0qfac

bis0qfac1#

使用上一个问题中的the suggested solution提取一个平面值列表,然后从每对值中创建一个新对象:

$json = Get-Content path\to\json.json -Raw | ConvertFrom-Json
$queue = [System.Collections.Generic.Queue[object]]::new()
$queue.Enqueue($json)

$extractedValues = while ($queue.Count) {
    $items = $queue.Dequeue()
    foreach ($item in $items) {
        if ($item -is [System.Collections.ICollection]) {
            $queue.Enqueue($item)
            continue
        }
        $item
    }
}

$results = for ($i = 0; $i -lt $extractedValues; $i += 2) {
  [PSCustomObject]@{
    A = $extractedValues[$i]
    B = $extractedValues[$i+1]
  }
}

字符串
如果数据不一致(例如,如果内部数组中的第二个值可能不是字符串),但您可以修改以前的解决方案,以测试给定集合的计数是否为2,并且第一个槽中是否有字符串:

$json = Get-Content path\to\json.json -Raw | ConvertFrom-Json
$queue = [System.Collections.Generic.Queue[object]]::new()
$queue.Enqueue($json)

$results = while ($queue.Count) {
    $items = $queue.Dequeue()
    foreach ($item in $items) {
        if ($item -is [System.Collections.ICollection]) {
            if ($item.Count -eq 2 -and $item[0] -is [string]){
                # we've reached a leaf value, output as object
                [PSCustomObject]@{
                    A = $item[0]
                    B = $item[1]
                }
            }
            else {
                # otherwise, continue traversing the structure
                $queue.Enqueue($item)
            }
            continue
        }
        $item
    }
}

kjthegm6

kjthegm62#

类似于Mathias's last example的方法,但递增一个强制为char的索引(65将是A)。缺点是,如果数组没有统一的计数,你最终会得到非规范化的对象或 * 对象没有统一的属性 *。

$json = Get-Content path\to\stuff.json -Raw | ConvertFrom-Json
$queue = [System.Collections.Generic.Queue[object]]::new()
$queue.Enqueue($json)

$out = [ordered]@{}
while ($queue.Count) {
    $items = $queue.Dequeue()
    $char = 65

    foreach ($item in $items) {
        if ($item -isnot [System.Collections.ICollection]) {
            $out[[char] $char++] = $item
            continue
        }

        $queue.Enqueue($item)
    }

    if ($out.Keys) {
        [pscustomobject] $out
        $out.Clear()
    }
}

字符串
输出应该如下所示:

A         B
-         -
test-1234 7/11/2023 1:00:24 AM
sb-00091  7/11/2023 1:00:21 AM

相关问题