使用 PowerShell 解析 JSON 檔案
- 在 PowerShell 中下載 JSON 檔案
-
在 PowerShell 中使用
Invoke-Request
命令 -
使用
Invoke-RestMethod
Cmdlet - 使用 PowerShell 解析 JSON 檔案
-
在 PowerShell 中使用
Invoke-WebRequest
下載過濾後的物件
許多 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_url
和 name
屬性。
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 specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.
LinkedIn