我正在试图找到一种方法来处理从API请求获得的输出。
输出类似于此:
[
{
"Date": "19/5/2022",
"ProductId": "0001",
"ProductName": "Fizzy Drink",
"Cost": "2.32",
"Currency": "USD",
},
{
"Date": "16/5/2022",
"ProductId": "0002",
"ProductName": "Dark Chocolate",
"Cost": "6.52",
"Currency": "USD",
},
{
"Date": "10/5/2022",
"ProductId": "0003",
"ProductName": "Snacks",
"Cost": "4.2",
"Currency": "USD",
}
]
如何操作这种类型的数据?
我的目标是获得这样的东西:
- 日期:2022年5月19日
- 产品ID 0001
- ProductName泡沫饮料
- 成本2.32
- 货币美元
- 日期:2022年5月16日
- 产品ID 0002
- ProductName黑巧克力
- 成本6.52
- 货币美元
我试过这样的东西:(没有成功(
foreach($GetInfo in $IDInfo)
{
$ID = $GetInfo.data.Date
$Name = $GetInfo.data.ProductId
Write-Host $ID
Write-Host $Name
}
但每次我得到,日期在一行,ProductID在第二行,ProductName在第三行。
类似:
19/5/2022 16/5/2022 16/5/2022
0001 0002 0003
Fizzy Drink Dark Chocolate Snacks
您的输出意味着$GetInfo.data
是数组,这意味着属性访问(如.Date
(使用成员访问枚举,这意味着您将返回所有数组元素的.Date
值。
因此,您还需要一个内部循环:
foreach($GetInfo in $IDInfo)
{
# Loop over the elements of the array in .data
foreach ($element in $GetInfo.data) {
$Id = $element.Date
$Name = $element.ProductId
# ... work with these variables here;
# e.g., output their values (don't use Write-Host, unless
# you want to print to the display only).
$Id, $Name
}
}
请注意,正如Jeroen Mostert所指出的,将示例JSON文本传递给ConvertFrom-Json
可以方便地将JSON数组解析为.NET对象(类型为[pscsustomobject]
(,您可以访问其属性:
但是,Windows PowerShell中有一个警告(不再在PowerShell(Core(7+(:
注意:假设您的示例JSON输入有多余的尾随,
字符。在每个对象的最终属性之后,我假设您使用的是PowerShell(Core(,因为Windows PowerShell会抱怨这一点;然而,下面讨论的陷阱仍然值得未来的读者指出。
如果直接处理解析JSON数组的ConvertFrom-Json
或Invoke-RestMethod
调用的输出,并且希望逐个处理生成的对象,请强制ConvertFrom-Json
枚举从JSON解析的顶级数组,方法是将调用封装在(...)
中:
$json = @'
[
{
"Date": "19/5/2022",
"ProductId": "0001",
"ProductName": "Fizzy Drink",
"Cost": "2.32",
"Currency": "USD"
},
{
"Date": "16/5/2022",
"ProductId": "0002",
"ProductName": "Dark Chocolate",
"Cost": "6.52",
"Currency": "USD"
},
{
"Date": "10/5/2022",
"ProductId": "0003",
"ProductName": "Snacks",
"Cost": "4.2",
"Currency": "USD"
}
]
'@
# Note the (...) around the ConvertFrom-Json call, required in Windows PowerShell.
# The same would apply if you send the ConvertFrom-Json output to the *pipeline*:
# (ConvertFrom-Json $json) | ForEach-Object { "This date: " + $_.Date }
foreach ($obj in (ConvertFrom-Json $json)) {
"This date: " + $obj.Date
}
背景:
在PowerShell(Core(7.0之前的版本中,
ConvertFrom-Json
和Invoke-RestMethod
通过管道将从JSON解析的数组作为整体发送,而不是逐元素发送,从而导致意外行为。将命令(管道(封装在
(...)
中,分组运算符将枚举这些数组。
有关详细信息,请参阅此答案。