現代のITインフラ運用やソフトウェア開発において、JSON(JavaScript Object Notation)はデータのやり取りを行うための標準的なフォーマットとして定着しています。
軽量で人間にとっても読みやすく、かつプログラムでの解析が容易であることから、クラウドサービスのAPIレスポンスや設定ファイルの記述に広く採用されています。
Windows環境を中心に強力な自動化を実現するPowerShellには、このJSON形式のデータを扱うための強力なコマンドレットとして「ConvertFrom-Json」が用意されています。
本記事では、PowerShellを使用してJSONデータを効率的に読み込み、オブジェクトとして操作するための基本的な使い方から、実務で役立つ応用テクニックまでを詳しく解説します。
ConvertFrom-Jsonコマンドレットの基本機能
ConvertFrom-Jsonは、JSON形式の文字列をPowerShellのカスタムオブジェクト(PSCustomObject)やハッシュテーブルに変換するためのコマンドレットです。
このコマンドレットを使用することで、テキストデータに過ぎないJSONを、PowerShellのプロパティやメソッドとして直感的に操作できる形式へ落とし込むことが可能になります。
まずは、最もシンプルな文字列からの変換例を確認してみましょう。
# JSON形式の文字列を定義
$jsonString = '{"Name": "Taro", "Age": 25, "City": "Tokyo"}'
# 文字列をオブジェクトに変換
$user = $jsonString | ConvertFrom-Json
# プロパティにアクセスして表示
$user.Name
$user.Age
Taro
25
上記の例では、パイプラインを通じてJSON文字列をConvertFrom-Jsonに渡しています。
出力されたオブジェクトは、ドット演算子を用いることで個別の要素にアクセスできることがわかります。
JSONファイルを読み込む標準的な手順
実務においては、スクリプト内に直接JSONを記述するよりも、外部のファイルから読み込むケースが圧倒的に多いでしょう。
JSONファイルを読み込む際には、Get-Contentコマンドレットと組み合わせて使用するのが一般的です。
ここで非常に重要なポイントは、Get-Contentに-Rawパラメータを付与することです。
デフォルトのGet-Contentはファイルを一行ずつの配列として読み込みますが、ConvertFrom-Jsonは一つの完全なJSON文字列を期待するため、ファイル全体を一つの文字列として読み込む必要があります。
# sample.json の内容を読み込んで変換
$config = Get-Content -Path "./config.json" -Raw | ConvertFrom-Json
# 読み込んだデータを確認
$config
もし-Rawを忘れてしまうと、JSONが複数行にわたる場合に解析エラーが発生し、正しくオブジェクト化されません。
PowerShell 7以降ではこの動作が改善されつつありますが、互換性と確実性を担保するために-Rawの指定を推奨します。
複数のオブジェクトが含まれるJSONの扱い
JSONファイル内に配列形式で複数のデータが格納されている場合も、ConvertFrom-Jsonは自動的にそれらを配列オブジェクトとして処理します。
以下のコードは、ユーザーリストが含まれるJSONを読み込み、特定の条件でフィルタリングする例です。
# 複数のユーザー情報を持つJSONを読み込み
$users = Get-Content -Path "./users.json" -Raw | ConvertFrom-Json
# Ageが20歳以上のユーザーだけを抽出
$adults = $users | Where-Object { $_.Age -ge 20 }
$adults
このように、読み込んだ後は通常のPowerShellオブジェクトと同じようにWhere-ObjectやForEach-Objectで処理できる点が最大のメリットです。
PowerShell 7で強化された新機能と活用法
PowerShell 7.x系(Core)では、ConvertFrom-Jsonにいくつかの重要なパラメータが追加され、利便性が飛躍的に向上しました。
特に複雑なデータ構造や、大規模なデータを扱う際にこれらの機能が威力を発揮します。
ハッシュテーブルとして読み込む「-AsHashtable」
デフォルトではPSCustomObjectとして出力されますが、-AsHashtableパラメータを使用することでハッシュテーブル形式で受け取ることができます。
ハッシュテーブルは、データの追加や削除が容易であり、特定のキーが存在するかどうかを確認する処理において高速に動作します。
# ハッシュテーブルとして読み込み
$data = Get-Content -Path "./settings.json" -Raw | ConvertFrom-Json -AsHashtable
# 特定のキーが存在するか確認
if ($data.ContainsKey("Theme")) {
Write-Host "テーマ設定が見つかりました: $($data['Theme'])"
}
設定情報を動的に変更したり、既存のデータ構造とマージしたりする処理が必要な場合は、ハッシュテーブル形式での読み込みを選択するのが賢明です。
深い階層を制御する「-Depth」パラメータ
非常に複雑で階層が深いJSONデータを扱う際、以前のバージョンでは一定以上の深さが無視されることがありました。
最新のPowerShellでは、-Depthパラメータを指定することで、解析する階層の深さを明示的に定義できます。
デフォルト値は1024となっており、通常は問題になりませんが、再帰的な構造を持つ特殊なデータではこの値を調整する必要があります。
Web APIから直接JSONを取得する
ファイルだけでなく、Web APIを通じてJSONデータを取得し、そのままPowerShellで解析するケースも増えています。
この場合、Invoke-RestMethodコマンドレットを使用するのが最も効率的です。
Invoke-RestMethodは、取得したJSONを内部で自動的にConvertFrom-Json相当の処理を行ってから返してくれます。
# Web APIからJSONを取得
$response = Invoke-RestMethod -Uri "https://api.example.com/data" -Method Get
# 自動的にオブジェクト化されているため、そのままアクセス可能
$response.items[0].title
もしヘッダー情報の確認などが必要でInvoke-WebRequestを使用した場合は、明示的にConvertFrom-Jsonを呼び出す必要があります。
# Invoke-WebRequestを使用した場合
$webResponse = Invoke-WebRequest -Uri "https://api.example.com/data"
$data = $webResponse.Content | ConvertFrom-Json
実務で役立つトラブルシューティングとTips
JSONの読み込みにおいて、初心者が陥りやすいエラーや、知っておくと便利なテクニックをまとめました。
文字化けを防ぐエンコーディングの指定
日本語が含まれるJSONファイルを読み込む際、文字化けが発生することがあります。
これはファイルの保存形式(エンコーディング)と、PowerShellが読み込む際の解釈が一致していないために起こります。
現代の標準であるUTF-8(BOMなし)であれば多くのケースで自動判別されますが、明示的に指定することでトラブルを回避できます。
# エンコーディングを指定して読み込み
$json = Get-Content -Path "./data.json" -Encoding utf8 -Raw | ConvertFrom-Json
大規模なJSONファイルのパフォーマンス対策
数GBに及ぶような巨大なJSONファイルを読み込む場合、Get-Content -Rawはメモリを大量に消費するため推奨されません。
そのようなケースでは、.NETのSystem.Text.Jsonライブラリを直接呼び出すか、ストリームを利用した処理を検討する必要があります。
しかし、数MB程度の一般的な設定ファイルやログであれば、ConvertFrom-Jsonで十分なパフォーマンスが得られます。
JSONの構文チェック
読み込むJSONが正しい構文であるか不安な場合、Test-Jsonコマンドレット(PowerShell 7以降)を使用すると事前に検証が可能です。
$jsonText = Get-Content -Path "./config.json" -Raw
if (Test-Json -Json $jsonText) {
$config = $jsonText | ConvertFrom-Json
Write-Host "正常に読み込まれました。"
} else {
Write-Error "JSONの構文が正しくありません。"
}
読み込みオプションの比較表
用途に応じた読み込み方法の使い分けを以下の表に示します。
| 手法 | 主な用途 | メリット |
|---|---|---|
| Get-Content -Raw | ConvertFrom-Json | ローカルファイルの読み込み | 最も一般的で直感的 |
| Invoke-RestMethod | Web APIとの連携 | 変換処理が自動化されている |
| ConvertFrom-Json -AsHashtable | 動的なデータ操作 | キーによる高速アクセスが可能 |
| [System.Text.Json.JsonSerializer]::Deserialize | 超大規模データの処理 | メモリ消費を抑え高速 |
まとめ
PowerShellにおけるJSONの読み込みは、ConvertFrom-Jsonをマスターすることで驚くほど簡単になります。
基本となるGet-Content -Rawとの組み合わせを確実に押さえた上で、PowerShell 7で導入された-AsHashtableや-Depthといった便利なオプションを状況に応じて使い分けましょう。
また、Web API連携においてはInvoke-RestMethodを活用することで、コードの記述量を大幅に削減できます。
構造化されたデータを自在にオブジェクトとして操るスキルは、インフラの自動化やクラウド管理において強力な武器となります。
まずは身近な設定ファイルをJSON化し、PowerShellで読み込むところから始めてみてください。
