【问题标题】:Working with Powershell invoke-restmethod and json response使用 Powershell 调用休息方法和 json 响应
【发布时间】:2018-07-31 15:17:52
【问题描述】:

这里是 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 中更容易使用。但我不能为我的生活做这项工作。我试图从上面的AssetHeaderDataAssetEntitlementData 中提取一些数据。我确信我可以做一些正则表达式,但如果有更简单的方法,我完全赞成!

感谢任何帮助。谢谢!

【问题讨论】:

    标签: json powershell


    【解决方案1】:

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

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

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

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

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

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

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

    所以要看看你想要的属性里面有什么,只需继续挖掘:

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

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

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

    根据评论更新

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

    AssetWarrantyResponse 是一个单一的属性,它会制表完成。它的 value 是一个数组。所以尝试执行.AssetWarrantyResponse.AssetHeaderData 不会完成制表符,因为它不是对象(数组)的属性。

    如果您使用$response.AssetWarrantyResponse[0].AssetHeaderData,那么制表符补全就可以了。

    在键入时它“工作”的原因是 PowerShell v3 中的更改。

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

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

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

    因此,即使您想使用 v3 的优点,您也可以使用 tab 补全,并额外输入一些内容:

    $response.AssetWTAB[0].AssetHTAB

    然后返回并删除[0]

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

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

    【讨论】:

    • 虚幻。 . .我可以发誓我像你说的那样尝试更深入!我认为我的错误是这样的——我习惯于在选项卡时输入变量和命令。它是为 $response 和assetwarrantyresponse 做的。没有为assetheaderdata做这件事,所以我认为不行。我应该只是输入它。手动输入它有效,当然,选项卡适用于它之后的 NEXT 变量。无论如何——这是一场胜利!谢谢,以后可能会回来寻求更多帮助!
    • @Pat 很高兴它正在工作!查看我的答案的更新,了解为什么会这样,以及你应该如何处理它。
    • 非常感谢您的额外解释!刚刚完成了一些额外的编码,一切顺利!
    猜你喜欢
    • 2011-09-21
    • 1970-01-01
    • 2019-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多