使用 PowerShell 解析 JSON 文件

Marion Paul Kenneth Mendoza 2023年1月30日 2022年5月16日
  1. 在 PowerShell 中下载 JSON 文件
  2. 在 PowerShell 中使用 Invoke-Request 命令
  3. 使用 Invoke-RestMethod Cmdlet
  4. 使用 PowerShell 解析 JSON 文件
  5. 在 PowerShell 中使用 Invoke-WebRequest 下载过滤后的对象
使用 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)"
Marion Paul Kenneth Mendoza avatar Marion Paul Kenneth Mendoza avatar

Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.

LinkedIn

相关文章 - PowerShell JSON