【问题标题】:How to parse/access JSON returned by Invoke-WebRequest in Powershell 4如何在 Powershell 4 中解析/访问 Invoke-WebRequest 返回的 JSON
【发布时间】:2020-05-06 16:22:34
【问题描述】:

我在 powershell 脚本 (Powershell 4.0) 中对 API 进行了以下调用:

$Json = Invoke-WebRequest -Uri $RequestURL -UseBasicParsing -Headers $headers -ContentType  'application/json; charset=utf-8' -Method POST -Body $postParams -TimeoutSec 40 

...并将响应的内容(JSON 格式的字符串)写入文件:

Set-Content $path -Value $Json.Content

典型响应示例...

{
    "MyArray": [{
        "MyField": "A1",
        "MyField2": "A2"
    }, {
        "MyField": "B1",
        "MyField2": "B2"
    }]
}

一切都很好,但是现在我需要将返回的内容解析为 JSON 并从这个 Powershell 脚本中查询一些属性。

我想我需要将我的字符串转换为“正确的”JSON,然后转换为 powershell 对象才能访问属性......所以我尝试了 ConvertTo-Json 和 ConvertFrom-Json 的组合,但似乎永远无法以字符串以外的任何方式访问它。比如……

    $x = $Json.Content | ConvertTo-Json
    Write-Host $x.MyArray[0].MyField

    $y = $x | ConvertFrom-Json
    Write-Host $y[0].MyArray[0].MyField

在上述两种情况下,我都会收到错误消息“无法索引到空数组”,表明 MyArray 为空。

如何将我的 $Json 响应对象转换为可以深入研究的对象?

【问题讨论】:

  • 考虑Invoke-RestMethod;它会自动处理转换。除此之外,您似乎实际上是在ConvertFrom-Json ($Json.Content) 之后;内容 JSON,您不想将其转换为 JSON。如果我将您的回复复制到剪贴板并执行(Get-Clipboard | ConvertFrom-Json).MyArray[0].MyField,我会得到预期的结果。
  • @JeroenMostert - ConvertFrom-Json ($Json.Content) 导致错误“ConvertFrom-Json:无法处理参数,因为参数“名称”的值无效”。
  • 嗯,在这种情况下,管道输入应该仍然可以工作 ($Json.Content | ConvertFrom-Json)。否则,Content 对象会发生一些奇怪的事情,阻止它被正确访问,尽管我不知道那可能是什么(编码不匹配)?

标签: json powershell


【解决方案1】:

ConvertFrom-Json

将 JSON 格式的字符串转换为自定义对象或哈希表。

ConvertFrom-Json cmdlet 转换 JavaScript 对象表示法 (JSON) 格式化字符串到自定义 PSCustomObject 对象,该对象具有 JSON 字符串中每个字段的属性。

将响应转换为自定义对象或哈希表后,您可以访问各个属性

该链接包含编码示例

【讨论】:

    【解决方案2】:

    这似乎有效...

    [void][System.Reflection.Assembly]::LoadWithPartialName("System.Web.Extensions")
        $x = (New-Object -TypeName System.Web.Script.Serialization.JavaScriptSerializer -Property @{MaxJsonLength=67108864}).DeserializeObject($Json.Content)
        Write-Host $x.MyArray[0].MyField
    

    ...虽然还不知道为什么。

    【讨论】:

      猜你喜欢
      • 2021-11-07
      • 2021-10-19
      • 2022-12-07
      • 1970-01-01
      • 2018-07-19
      • 2015-06-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多