使用Powershell调用restmethod和json响应

Pat*_*Pat 3 powershell json

Powershell和JSON在这里非常新手,所以可能需要一些额外的帮助.不是编码员,fyi.

我正在使用戴尔的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'
Run Code Online (Sandbox Code Playgroud)

如果我看一下$response,这是输出 -

AssetWarrantyResponse : {@{AssetHeaderData=; ProductHeaderData=; AssetEntitlementData=System.Object[]}}
InvalidFormatAssets   : @{BadAssets=System.Object[]}
InvalidBILAssets      : @{BadAssets=System.Object[]}
ExcessTags            : @{BadAssets=System.Object[]}
AdditionalInformation :
Run Code Online (Sandbox Code Playgroud)

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

$response.AssetWarrantyResponse|fl

AssetHeaderData      : @{BUID=11; ServiceTag=....
ProductHeaderData    : @{SystemDescription=Op....
AssetEntitlementData : {@{StartDate=2017-11-2....
Run Code Online (Sandbox Code Playgroud)

我看到有一个convertfrom-json的命令.看起来这将采取响应并使其更容易在Powershell中使用.但我不能为我的生活做这项工作.我正试图从中AssetHeaderDataAssetEntitlementData以上提取一些数据.我敢肯定我可以做一些正则表达式,但如果有更简单的方法,我就是全力以赴!

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

bri*_*ist 5

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

在这种情况下,Invoke-RestMethod已经自动完成了相应的操作ConvertFrom-Json,也就是说,它已经从API返回了JSON并从中创建了一个对象.

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

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

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

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

当你看到它时,你会看到更多属性,它们也是对象.根据您发布的输出,我认为它不会更深入地嵌套.

因此,要查看所需属性中的内容,请继续挖掘:

$response.AssetWarrantyResponse.AssetHeaderData
$response.AssetWarrantyResponse.AssetEntitlementData
Run Code Online (Sandbox Code Playgroud)

您根本不需要正则表达式,因为数据已经适当分解.

如果您想要使用其他内容,请将其编辑到您的问题中(如果有必要,可以发布新问题),我们也可以提供帮助.

根据评论更新

标签完成可能很挑剔.但是,当我再次查看您的数据时,我想我明白为什么您看到了所看到的内容,并且标签完成工作正常.

AssetWarrantyResponse是一个属性,它将标签完成.它的是一个数组.因此,尝试执行操作.AssetWarrantyResponse.AssetHeaderData不会完成选项卡,因为它不是对象(数组)的属性.

如果你这样做,$response.AssetWarrantyResponse[0].AssetHeaderData那么标签完成将起作用.

它只是在输入时"工作"的原因是因为PowerShell v3发生了变化.

在v3之前,如果你有一个对象数组并想获得.Thing每个对象的属性数组,你必须自己枚举它:

$things = foreach($item in $arr) {
    $arr.Thing
}
Run Code Online (Sandbox Code Playgroud)

v3添加了一个简洁的功能,你可以做到$things = $arr.Thing,它为你处理它.但由于数组中的每个项目可能完全不同并且具有不同的属性,因此选项卡完成不会尝试进入每个项目并阅读它们并决定选项卡的完成内容; 您必须取消引用自己的单个项目,然后选项卡完成将按预期工作.

因此,即使您想要使用v3优点,也可以通过一些额外的输入来使用制表符:

$response.AssetWTAB[0].AssetHTAB

然后回去删除[0].

请记住,如果该属性是一个数组,您可能应该期望它.AssetWarrantyResponse.AssetHeaderData也可能是一个数组,因此您必须适当处理该情况.

如果您不关心这种情况并且只想要第一个项目,请使用[0](或使用,[-1]如果您只想要最后一个项目).要点是,如果你想假设它只是一个单独的元素,请确保代码处理这个假设,这样它就不会在边缘情况下做出奇怪的事情.