Powershell解析API输出JSON



我正在试图找到一种方法来处理从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-JsonInvoke-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-JsonInvoke-RestMethod通过管道将从JSON解析的数组作为整体发送,而不是逐元素发送,从而导致意外行为。

  • 将命令(管道(封装在(...)中,分组运算符将枚举这些数组。

有关详细信息,请参阅此答案。

最新更新