我有一个这样的 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)
但是,这会循环遍历数据数组中的所有项目。
任何想法。
第一循环
foreach ($root in $array.data)
内部循环(根循环内部)
foreach ($item in $root.items)
事实上,嵌套循环必须引用外循环的迭代变量,而不是整个输入对象图,正如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