无法从 Powershell API 的 Invoke-RestMethod 访问数据

问题描述

在这里尝试了所有我能想到的方法,但我是 powershell 的新手,但还是一片空白。希望有人能提供帮助。

我有一个 powershell 调用

$appSettings = Invoke-RestMethod -Uri $url -Method Get -Headers $header

如果我将 $appSettings 登录到 powerhsell IDE,我得到:

PS H:\> $appSettings
{
  "DetailedErrors": true,"Logging": {
    "LogLevel": {
      "Default": "Trace","Microsoft": "Warning","Microsoft.Hosting.Lifetime": "information"
    }
  }
}

但是,我无法访问任何这些属性

PS H:\> $appSettings.DetailedErrors

什么都不返回...

PS H:\> ConvertTo-Json -InputObject $appSettings
"{\n  \"DetailedErrors\": true,\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Trace\",\n   


PS H:\> $appSettings.'Logging'

PS H:\> $appSettings | Select -Property Logging

Logging
-------

那么我如何获得 Logging.LogLevel.Default(意思是我想知道它说的是“Trace”)??

更新完整的错误日志

PS H:\> $AppSettinsJson = $appsettings | ConvertFrom-Json
ConvertFrom-Json : Invalid object passed in,':' or '}' expected. (362): {
  "DetailedErrors": true,"Microsoft.Hosting.Lifetime": "information"
    }
  },"connectionStrings": {
    "Default": "Something"
  },"LockingTimeout": "60",//in seconds,"Major": "1","Minor" :  "0","buildDate": "#{buildDate}#",}
At line:1 char:34
+ $AppSettinsJson = $appsettings | ConvertFrom-Json
+                                  ~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [ConvertFrom-Json],ArgumentException
    + FullyQualifiedErrorId : System.ArgumentException,Microsoft.PowerShell.Commands.ConvertFromJsonCommand

解决方法

这是因为您尝试访问它的方式。

$appsettings 不是您想要使用的。它是返回的 JSON 字符串 $appsettings。

所以,这...

$JsonData = @'
{
  "DetailedErrors": true,"Logging": {
    "LogLevel": {
      "Default": "Trace","Microsoft": "Warning","Microsoft.Hosting.Lifetime": "Information"
    }
  }
}
'@ | ConvertFrom-Json

$JsonData.DetailedErrors
# Results
<#
True
#>


$JsonData.Logging
# Results
<#
LogLevel                                                                   
--------                                                                   
@{Default=Trace; Microsoft=Warning; Microsoft.Hosting.Lifetime=Information}
#>

$JsonData.Logging.LogLevel
# Results
<#
Default Microsoft Microsoft.Hosting.Lifetime
------- --------- --------------------------
Trace   Warning   Information  
#>

所以,如果我重构你所做的。我会这样做:

$appSettings = (Invoke-RestMethod -Uri $url -Method Get -Headers $header) | ConvertFrom-Json

$appSettings.DetailedErrors
# Results
<#
True
#>


$appSettings.Logging
# Results
<#
LogLevel                                                                   
--------                                                                   
@{Default=Trace; Microsoft=Warning; Microsoft.Hosting.Lifetime=Information}
#>

$appSettings.Logging.LogLevel
# Results
<#
Default Microsoft Microsoft.Hosting.Lifetime
------- --------- --------------------------
Trace   Warning   Information  
#>

根据您对所用 PS 版本的反应进行更新

*Json cmdlet 仅适用于 PSv5 及更高版本。

# Results
ModuleType Name                         CmdletName_FinctionName             PowerShellVersion
---------- ----                         -----------------------             -----------------
Manifest   Microsoft.PowerShell.Utility ConvertTo-Json                      5.1              
Manifest   Microsoft.PowerShell.Utility ConvertFrom-Json                    5.1 
#>

因此是您的错误。

如果您坚持使用 PSv2,那么您可以通过这种方式解析 JSON。

# Another approach in Windows 8 and higher
$jsonObjectClass = [Windows.Data.Json.JsonObject,Windows.Data.Json,ContentType=WindowsRuntime]
($jsonObject     = $jsonObjectClass::Parse('{"data":["powershell","rocks"]}'))

$jsonObjectClass = [Windows.Data.Json.JsonObject,ContentType=WindowsRuntime]
($jsonObject     = $jsonObjectClass::Parse($JsonData))

更新 - 您也可以将字符串保存到文件中,然后对字符串进行硬解析。

Clear-Host
((Get-Content -LiteralPath 'D:\Temp\appsettings.txt' | 
Select-String 'Default' -Context 0) -replace '\s+|\"|,' -split(':'))[1]
# Results
<#
Trace
#>