使用具有多列 headers 和多行的 Powershell convert JSON

Using Powershell convert JSON with multiple column headers and rows

我已经使用 开始了。但是,我有以下 JSON 数据,其中包含多列 headers 和包含多组数据的行。

{
    "columnHeaders": {
        "dimensions": [
            "year_month",
            "tag1",
            "computer_name",
            "account_name",
            "resource_name",
            "category3",
            "tag8",
            "tag11",
            "db_engine"
        ],
        "metrics": [
            {
                "name": "usage_amount",
                "dataType": "float"
            },
            {
                "name": "pretax_cost",
                "dataType": "currency"
            },
            {
                "name": "actial_cost",
                "dataType": "currency"
            }
        ]
    },
    "rows": [
        {
            "dimensions": [
                "2022-04",
                "(not set)",
                "server1",
                "account1",
                "server1_bios_name",
                "undefined",
                "(not set)",
                "(not set)",
                "SQLServer"
            ],
            "metrics": [
                {
                    "count": "1",
                    "max": "0.52",
                    "min": "0.10",
                    "sum": "0.52"
                },
                {
                    "count": "1",
                    "max": "-22.24",
                    "min": "-22.24",
                    "sum": "-22.24"
                },
                {
                    "count": "1",
                    "max": "1.26",
                    "min": "0",
                    "sum": "1.52"
                }
            ]
        }
    ]
}

如果我使用最后一个建议,我可以获得很好的尺寸,但我需要每个指标的“总和”值。

$A = Get-Content 'C:\Temp\sample.json' | ConvertFrom-Json 


    $Rows = 
    ForEach($Row in $A.rows )
    {
        $TmpHashCol = [Ordered]@{}
        $TmpHashMet = [Ordered]@{}
       
        For($i = 0; $i -lt $Row.dimensions.Length; ++$i )
        {
            $TmpHashCol.Add($A.columnHeaders.dimensions[$i],$Row.dimensions[$i])

                 
                 #For($s = 0; $s -lt $Row.metrics.length; ++$s )
                 #   {
             $TmpHashMet.Add($A.columnHeaders.metrics.name[$i],$Row.metrics.sum[$i])
             #$TmpHashMet.Add($A.columnHeaders.metrics[$i],$Row.metrics.sum[$i])
            
                  #  }

            
        }

对于“$TmpHashMet”,我收到错误:使用“2”个参数调用“添加”时出现异常:“密钥不能为空。但是,当我尝试指定名称时,它不喜欢那个。

这是我希望数据完成后的样子:

year_month      :   2022-04
tag1            :   (not set)
computer_name   :   server1
account_name    :   account1
resource_name   :   server1_bios_name
category3       :   undefined
tag8            :   (not set)
tag11           :   (not set)
db_engine       :   SQLServer
usage_amount    :   0.52
pretax_cost     :   -22.24
actial_cost     :   1.52

非常感谢!!!

这是您可以做到的一种方法,您需要为 .metrics.sum 上的值创建一个新的内部循环,我还稍微修改了您的代码,以便它在 Json 超过 1 行的情况下工作。

$headers = $json.columnHeaders.dimensions
$metrics = $json.columnHeaders.metrics.name

foreach($row in $json.rows) {
    $out = [ordered]@{}
    for($i = 0; $i -lt $row.dimensions.Count; $i++) {
        $out[$headers[$i]] = $row.dimensions[$i]
    }
    for($i = 0; $i -lt $metrics.Count; $i++) {
        $out[$metrics[$i]] = $row.metrics.sum[$i]
    }
    [pscustomobject] $out
}

输出应该类似于您想要的:

year_month    : 2022-04
tag1          : (not set)
computer_name : server1
account_name  : account1
resource_name : server1_bios_name
category3     : undefined
tag8          : (not set)
tag11         : (not set)
db_engine     : SQLServer
usage_amount  : 0.52
pretax_cost   : -22.24
actial_cost   : 1.52