PowerShell 将带有标头和嵌套项目的 JSON 解析为行

问题描述 投票:0回答:2

我有一个这样的 JSON,

{
    "TotalCount": 2,
    "Data": [
        {
            "ID": 9663696221792,
            "Code": "08099991",
            "Items": [
                {
                    "Amount": 5.05,
                    "LineNo": 1
                },
                {
                    "Amount": 16.08,
                    "LineNo": 2
                }               
            ]
        },
        {
            "ID": 9663696221793,
            "Code": "08028001",
            "Items": [
                {
                    "Amount": 26.13,
                    "LineNo": 1
                }
            ]
        }
    ]

}

我需要这样的输出,

身份证 代码 成本
标题 9663696221792 08099991 21.13
第 1 项 9663696221792 08099991 5.05
第 2 项 9663696221792 08099991 16.08

身份证 代码 成本
标题 9663696221793 08028001 26.13
第 1 项 9663696221793 08028001 26.13

等等更多标题和项目

到目前为止

$array = Get-Content -Path 'response.json' | ConvertFrom-Json

然后我循环浏览

foreach ($root in $array.data)

然后虽然每一项

foreach ($Item in $array.data.items)

但是,这会循环遍历数据数组中的所有项目。

任何想法。

json powershell transformation object-graph
2个回答
0
投票

第一循环

foreach ($root in $array.data)

内部循环(根循环内部)

foreach ($item in $root.items)


0
投票
  • 事实上,嵌套循环必须引用外循环的迭代变量,而不是整个输入对象图,正如Daniel指出的那样。

  • 如果您错误地使用

    $array.Data.Items
    访问嵌套循环中的整个对象图,则会对 $array.Data 数组执行 成员访问枚举
    ,这意味着 
    .Item
    属性值跨所有数组元素被退回。

将它们放在一起(为了清楚起见,重新命名了变量);请注意,仍然选择性地使用成员访问枚举,即在

$product.Items.Amount
中,以便获取所有
.Item
元素的金额:

# Note: -Raw makes Get-Content much faster by reading the entire file
#       content into as single, multiline string.
$objectGraphfromJson = Get-Content -Raw response.json | ConvertFrom-Json

# Loop over all elements of the array in the `.Data` property.
foreach ($product in $objectGraphfromJson.Data) {
  # Create the header object.
  [pscustomobject] @{
    row = 'Header'
    ID = $product.ID
    Code = $product.Code
    # Sum up the amounts across all child items.
    Cost = ($product.Items.Amount | Measure-Object -Sum).Sum
  }
  # For each `.Data` element, loop over its items and create an object for each.
  foreach ($item in $product.Items) {
    [pscustomobject] @{
      row = 'Item ' + $item.LineNo
      ID = $product.ID
      Code = $product.Code
      Cost = $item.Amount
    }  
  }
}

输出:

row               ID Code       Cost
---               -- ----       ----
Header 9663696221792 08099991 21.130
Item 1 9663696221792 08099991  5.050
Item 2 9663696221792 08099991 16.080
Header 9663696221793 08028001 26.130
Item 1 9663696221793 08028001 26.130
© www.soinside.com 2019 - 2024. All rights reserved.