使用 PowerShell 解析 JSON 文件

许多 API 使用称为 REST 的协议。REST APIs 主要通过 Javascript 对象表示法或简单的 JSON 以一种语言进行交谈。

本文展示了如何使用 Windows PowerShell 直接与 REST API 对话并将数据转换为有用的东西。

JSON 是一种缩小人类可读数据和机器可读数据之间差距的方法。

在结构化数据对象之前,大多数操作系统依赖于文本解析工具,这些工具使用复杂的正则表达式 regex 来为简单文本带来结构。

我们现在可以使用 JSON 创建一个人类和程序都可以相对轻松地读取的字符串。

{
    "string": "this is a string. backslashes (\\) have to be escaped",
    "object": {
        "description": "This is a sample object nested inside our javascript object. Description is a string subproperty"
    },
    "numbers": 12345,
    "array": ["a string", "another string"]
}

JSON 易于读写,尽管有许多引号、逗号、括号和转义字符。

在 PowerShell 中下载 JSON 文件

首先,从 GitHub 获取一个使用 Invoke-RestMethod 命令的示例 JSON 到 PowerShell。

但是,了解如何转换 JSON 字符串仍然很重要。

在 PowerShell 中使用 Invoke-Request 命令

要使用 Windows PowerShell 查询 API 并获取一些 JSON 作为回报,请使用 Invoke-WebRequest 命令。

此命令可以通过 HTTP 查询任何 Web 服务或站点并返回信息(不仅仅是 JSON)。我们将使用这个示例来获取一些可以使用的 JSON。

  • 打开 PowerShell 控制台。
  • 运行 Invoke-WebRequest 命令查询 GitHub API,如下图所示。下面的代码片段将 cmdlet 返回的所有输出分配给 $webData 变量进行处理。
$webJSONData = Invoke-WebRequest -Uri "https://api.github.com/repos/PowerShell/PowerShell/releases/latest"

执行 ConvertFrom-Json 命令将存储在 content 属性中的 JSON 字符串转换为 PowerShell 对象。

$releases = ConvertFrom-Json $webJSONData.content

通过管道将 Windows PowerShell 对象传递给 Get-Member 命令。当你这样做时,我们将看到该对象是 System.Management.Automation.PSCustomObject 类型;不仅仅是一个简单的字符串。

$releases | Get-Member

使用 Invoke-RestMethod Cmdlet

使用 Invoke-RestMethod 命令与 Invoke-WebRequest 非常相似。它只消除了一行代码。

该 cmdlet 将自动假定一个 JSON 响应并为你转换它。

它在代码中阐明了你期望使用 API,并且你还期望 JSON 响应。

  • 打开你的 PowerShell 控制台
  • 运行 Invoke-RestMethod 获取发布信息
$releases_2 = Invoke-RestMethod -Uri "https://api.github.com/repos/PowerShell/PowerShell/releases/latest"

通过管道将 Windows PowerShell 对象传递给 Get-Member 命令。当你这样做时,我们将看到该对象是 System.Management.Automation.PSCustomObject 类型;不仅仅是一个简单的字符串。

$releases_2 | Get-Member

使用 PowerShell 解析 JSON 文件

让我们看一下上一节中定义的 $releases 变量。两个突出的属性是 browser_download_urlname 属性。

browser_download_url 属性与 URL 相关,而 name 属性可能与版本名称相关。

现在输出所有的 name 属性,如下所示。

$releases_2.assets.name

在 PowerShell 中使用 Invoke-WebRequest 下载过滤后的对象

## Using Invoke-RestMethod
$webAPIData = Invoke-RestMethod -Uri "https://api.github.com/repos/PowerShell/PowerShell/releases/latest"
## Using Invoke-WebRequest
$webAPIData = ConvertFrom-JSON (Invoke-WebRequest -uri "https://api.github.com/repos/PowerShell/PowerShell/releases/latest")
## The download information is stored in the "assets" section of the data
$assets = $webAPIData.assets
## The pipeline operator is used to filter the assets object to find the release version
$asset = $assets | where-object { $_.name -match "win-x64" -and $_.name -match ".zip"}
## Download the latest version
Write-output "Downloading $($asset.name)"
Invoke-WebRequest $asset.browser_download_url -OutFile "$pwd\$($asset.name)"