使用Powershell调用restmethod和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'

如果我看$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....

我看到有一个从json转换的命令。看起来这将获得响应,并使其更容易在Powershell中使用。但我一辈子都做不到。我试图从上面的AssetHeaderDataAssetEntitlementData中提取一些数据。我确信我可以做一些正则表达式,但如果有更简单的方法,我完全支持!

感谢您的帮助。谢谢

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

在这种情况下,Invoke-RestMethod自动为您完成了ConvertFrom-Json的等效操作,也就是说,它获取了从API返回的JSON并从中创建了一个对象

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

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

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

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

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

所以,要想了解你想要的房产内部有什么,只需继续挖掘:

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

您根本不需要regex,因为数据已经被适当地分解了。

如果你还想处理它,请将其编辑到你的问题中(或者在有必要的情况下发布一个新问题(,我们也可以提供帮助。

根据评论更新

制表符的完成可能很挑剔。但当我再次查看您的数据时,我想我明白了为什么您看到了您看到的内容,并且选项卡完成工作正常。

AssetWarrantyResponse是一个单独的属性,它将制表完成。其是一个数组。因此,尝试执行.AssetWarrantyResponse.AssetHeaderData不会完成制表,因为它不是对象(数组(的属性。

如果您执行了$response.AssetWarrantyResponse[0].AssetHeaderData,那么选项卡完成就可以了。

当只键入它时,它之所以"有效",是因为PowerShell v3中的一个更改。

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

$things = foreach($item in $arr) {
$arr.Thing
}

v3添加了一个巧妙的功能,您只需执行$things = $arr.Thing,它就可以为您处理所有事务。但是,由于数组中的每个项目可能完全不同,并且具有不同的属性,制表符完成并不会试图深入其中的每一个项目并读取它们,然后决定制表符完成什么;您必须取消引用自己的一个项目,然后选项卡完成将按预期工作。

因此,即使你想使用v3的优点,你也可以使用额外键入的标签完成:

$response.AssetWTAB[0].AssetHTAB

然后返回并删除[0]

请记住,如果该属性是一个数组,那么您可能会期望.AssetWarrantyResponse.AssetHeaderData也可以是一个阵列,因此无论接下来发生什么,都必须适当地处理这种情况。

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

最新更新