json - 使用 Powershell invoke-restmethod 和 json 响应

标签 json powershell

这里是 Powershell 和 JSON 的新手,因此可能需要一些额外的帮助。不是编码员,仅供引用。

我正在使用戴尔的 API 来检索机器的保修信息。如果可能,我想在 Powershell 中执行此操作。

到目前为止,这是我的代码 -

$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
$headers.Add("apikey", 'mykey')
$response = Invoke-RestMethod https://sandbox.api.dell.com/support/assetinfo/v4/getassetwarranty/servicecode -Headers $headers -contenttype 'application/json'

如果我看 $response ,这是输出 -
AssetWarrantyResponse : {@{AssetHeaderData=; ProductHeaderData=; AssetEntitlementData=System.Object[]}}
InvalidFormatAssets   : @{BadAssets=System.Object[]}
InvalidBILAssets      : @{BadAssets=System.Object[]}
ExcessTags            : @{BadAssets=System.Object[]}
AdditionalInformation :

做了一些挖掘,发现如果我使用下面的代码,我可以开始看到实际数据 -
$response.AssetWarrantyResponse|fl

AssetHeaderData      : @{BUID=11; ServiceTag=....
ProductHeaderData    : @{SystemDescription=Op....
AssetEntitlementData : {@{StartDate=2017-11-2....

我看到有一个用于 convertfrom-json 的命令。看起来这将接受响应并使其在 Powershell 中更容易使用。但我一辈子都做不到这项工作。我试图从 AssetHeaderData 中取出几条数据和 AssetEntitlementData以上。我确定我可以做一些正则表达式,但如果有更简单的方法,我完全赞成!

任何帮助表示赞赏。谢谢!

最佳答案

你做得很好!您所看到的是 PowerShell 的在屏幕上显示数据的系统。由于 PowerShell 倾向于处理复杂的对象,因此您处理的不仅仅是格式化的字符串输出,就像您从常规 shell 命令中看到的那样。

在这种情况下,Invoke-RestMethod已自动完成相当于 ConvertFrom-Json对你来说,也就是说,它已经获取了从 API 返回的 JSON 并从中创建了一个对象。

该对象具有各种属性,例如 .AssetWarrantyResponse ,每个都可以是一个值、一个数组或另一个对象。

所以你在输出中看到的,在你的第一个转储 $response 中在您的问题中,是响应对象具有的属性以及这些属性的值。

这些值看起来很有趣,因为它们本身就是对象,其中一些包含数组,并且很难一次全部格式化。

您已经发现可以直接引用属性,例如使用 $response.AssetWarrantyResponse .

当您查看它时,您会看到更多属性,它们也是对象。我认为它不会根据您发布的输出进行更深的嵌套。

因此,要查看您想要的属性中的内容,只需继续挖掘:

$response.AssetWarrantyResponse.AssetHeaderData
$response.AssetWarrantyResponse.AssetEntitlementData

您根本不需要正则表达式,因为数据已经被适本地分解了。

如果您还想用它做其他事情,请将其编辑到您的问题中(或在必要时发布一个新问题),我们也可以提供帮助。

根据评论更新

标签完成可能很挑剔。但是当我再次查看您的数据时,我想我明白为什么您看到了您所看到的,并且选项卡完成工作正常。
AssetWarrantyResponse是单个属性,它将完成选项卡。它的值是一个数组。所以试图做.AssetWarrantyResponse.AssetHeaderData不会制表符完成,因为它不是对象(数组)的属性。

如果你这样做了 $response.AssetWarrantyResponse[0].AssetHeaderData然后选项卡完成将起作用。

它在键入时“有效”的原因是因为 PowerShell v3 中的更改。

在 v3 之前,如果你有一个对象数组并且想要获取一个数组 .Thing每个对象的属性,您必须自己枚举它:
$things = foreach($item in $arr) {
    $arr.Thing
}

v3 添加了一个简洁的功能,您可以在其中执行 $things = $arr.Thing它会为您处理这一切。但是由于数组中的每一项可能完全不同并具有不同的属性,因此制表符补全不会尝试进入每一项并阅读它们并决定要完成哪些制表符;您必须取消对自己的单个项目的引用,然后选项卡完成将按预期工作。

因此,即使您想使用 v3 的优点,您也可以使用 Tab 补全功能,并输入一些额外的内容:
$response.AssetW TAB [0].AssetH标签

然后就回去删除[0] .

请记住,如果该属性是一个数组,您可能应该期待 .AssetWarrantyResponse.AssetHeaderData也可以是一个数组,因此您必须在接下来的任何事情中适本地处理这种情况。

如果您不关心这种情况而只想要第一项,请使用 [0] (或者如果您只想要最后一个,请使用 [-1])。重点是,如果您想假设它永远只是一个元素,请确保代码处理该假设,这样它就不会在边缘情况下做奇怪的事情。

关于json - 使用 Powershell invoke-restmethod 和 json 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51616785/

相关文章:

java - 将新条目添加到具有 dup key 的 json 文件

json - 将 JSON 对象作为 POST 请求发送

sql-server - 尝试创建新的SQL帐户时发生异常

powershell - 对象是空的吗?

php - JSON 中位置 43 的意外标记

java - 通过键jsonarray获取值

javascript - 使用 JSON.stringify 和 JSON.parse 将多边形坐标存储到 oracle 中

html - 从输入标签获取 javascript 值

powershell - 如何使用PowerShell和Web管理模块检查IIS中是否存在应用程序池?

powershell - 使用 PowerShell 复制 AD 用户