PowerShell で JSON オブジェクトをファイルに書き込む方法
- PowerShell カスタムオブジェクト
- PowerShell JSON オブジェクトから JSON 文字列へ
- 
          
            ConvertTo-JsonとOut-Fileを使用して JSON 文字列をファイルに保存
- 
          
            ConvertTo-JsonとSet-Contentを使用して JSON 文字列をファイルに保存
- 
          
            ConvertTo-JsonとAdd-Contentを使用して JSON 文字列をファイルに保存
- 結論
 
PowerShell は、強力で多用途なスクリプト言語であり、データを管理し操作するための強力なツールを提供します。JSON(JavaScript Object Notation)データを扱う際、PowerShell はカスタムオブジェクトを JSON 文字列に変換し、その後ファイルに書き込む効率的な方法を提供します。
この記事では、PowerShell オブジェクトを JSON 文字列に変換し、ConvertTo-Json、Out-File、Set-Content、Add-Content などのさまざまな cmdlet を使用してファイルに保存するプロセスについて詳しく説明します。
PowerShell カスタムオブジェクト
PSCustomObject は、カスタムオブジェクトを定義するために PowerShell で使用される基本的な要素です。カスタムオブジェクトは一般的にプロパティとそれに対応する値を含み、データを整理するための構造化された方法を提供します。
カスタムオブジェクトをゼロから作成するだけでなく、PowerShell は JSON オブジェクトを効率的に処理および操作することにも非常に優れています。
JSON カスタムオブジェクトの作成
例として JSON 構造を使って、JSON カスタムオブジェクトの作成方法を考えてみましょう。この JSON 構造を $MyJsonVar 変数に格納します。
$MyJsonVar = @"
 {
   "ExampleJson":{
     "Fruit1":{
       "Name":"Apple",
       "Price":"`$10.00"
     }
  }
 }
"@
出力:

この例では、果物の情報を表す JSON 構造を定義しました。
JSON を PowerShell カスタムオブジェクトに変換
JSON 表現を PowerShell カスタムオブジェクトに変換するために、ConvertFrom-JSON cmdlet を使用します。新たに作成した JSON オブジェクトを $MyJsonObject 変数に割り当てましょう。
$MyJsonObject = $MyJsonVar | ConvertFrom-Json
ConvertFrom-JSON cmdlet は、JSON 構造を適切な PSCustomObject に変換します。
作成した PowerShell カスタムオブジェクトの表示
新たに作成した PSCustomObject、つまり元の JSON 構造に対応するオブジェクトを表示しましょう。
$MyJsonObject
出力:

これらのコマンドは、カスタムオブジェクトに定義された果物の価格と名前のプロパティにアクセスし、表示します。したがって、$MyJsonObject という適切な PowerShell カスタムオブジェクトが得られたことが確認されました。
PowerShell JSON オブジェクトから JSON 文字列へ
PowerShell は、既存のカスタムオブジェクトを JSON 文字列に変換するための貴重なツールである ConvertTo-Json cmdlet を提供しています。このプロセスは、オブジェクトを JSON 形式のプレーンテキスト表現に効果的に変換し、必要に応じて利用したり保存したりすることができます。
ConvertTo-Json cmdlet の構文:
ConvertTo-Json
[-InputObject] <Object>
[-Depth <Int32>]
[-Compress]
[-EnumsAsStrings]
[-AsArray]
[-EscapeHandling <StringEscapeHandling>]
[<CommonParameters>]
ConvertTo-Json cmdlet は、JSON 変換プロセスをカスタマイズするためのいくつかのオプションパラメータを提供します。これらのパラメータの内訳は以下の通りです:
- 
-InputObject:このパラメータは基本的で、JSON 文字列への変換が必要なカスタムオブジェクトを指定します。このパラメータにオブジェクトを直接渡すことができます。
- 
-Depth:この重要なパラメータは、結果の JSON 文字列に含まれる階層の数を指定することができます。深さは、JSON 文字列に含まれるネストされたオブジェクトや配列の数を示します。ただし、不適切な使用はデータ損失を招く可能性があるため、慎重に使用する必要があります。デフォルト値は 2 に設定されています。 
- 
-Compress:このパラメータは、不必要な空白やインデントを削除することにより、出力 JSON を圧縮し、よりコンパクトな JSON 文字列を生成します。
- 
-EnumsAsStrings:このパラメータを使用すると、JSON 出力内で列挙値が文字列として表され、数値列挙を適切に扱えないシステムとの互換性が確保されます。
- 
-AsArray:このパラメータを指定すると、入力オブジェクトが配列でない場合でも、出力が JSON 配列としてフォーマットされます。
- 
-EscapeHandling:このパラメータは、JSON 文字列内で特殊文字がどのようにエスケープされるかをカスタマイズすることができ、オプションとしてDefault、EscapeNonAscii、EscapeHtml、およびDoNotEscapeがあります。
ConvertTo-Json cmdlet の使用を示すために、前のセクションのカスタムオブジェクト($MyJsonObject)を考えてみましょう:
カスタムオブジェクトを ConvertTo-Json cmdlet にパイプすることができます。$MyJsonObject をパイプ(|)で送信して、カスタムオブジェクトを JSON 文字列に変換します。
$MyJsonObject | ConvertTo-Json
出力:

ConvertTo-Json cmdlet の使用をさらに示しましょう。$AnotherJsonObject というカスタムオブジェクトを考えてみます:
$AnotherJsonObject = @{
    Name     = "John Doe"
    Age      = 30
    IsActive = $true
    Hobbies  = @("Reading", "Gardening")
    Address  = @{
        Street  = "1234 Elm St"
        City    = "Anytown"
        Country = "USA"
    }
}
このオブジェクトを JSON 文字列に変換し、出力を表示するには、以下のコマンドを使用します:
$AnotherJsonObject | ConvertTo-Json
この変換の出力は、元のカスタムオブジェクトを表す説明的な JSON 文字列です。
{
    "Name": "John Doe",
    "Age": 30,
    "IsActive": true,
    "Hobbies": [
        "Reading",
        "Gardening"
    ],
    "Address": {
        "Street": "1234 Elm St",
        "City": "Anytown",
        "Country": "USA"
    }
}
出力には、名前、年齢、活動状況、趣味、住所の詳細など、個人情報を表す構造化されたオブジェクト($AnotherJsonObject)が表示されています。
ConvertTo-Json と Out-File を使用して JSON 文字列をファイルに保存
ConvertTo-Json cmdlet を使用して JSON 文字列を取得したら、次の論理的なステップは、それをファイルに保存し、後で使用したり共有したりすることです。幸いなことに、PowerShell はこれを実現するためのいくつかの方法を提供しており、最も単純な方法の一つが Out-File の使用です。
Out-File cmdlet は、JSON 文字列をファイルに保存するための便利なツールです。以下にこのプロセスを示す例があります:
$MyJsonObject | ConvertTo-Json | Out-File -FilePath "D:\path\to\example.json"
出力:

この例では、$MyJsonObject は ConvertTo-Json を使用して生成された JSON 文字列を含む変数を表しています。パイプライン(|)は、この JSON 文字列をファイルに書き込むために Out-File に渡します。
-FilePath パラメータは、JSON 文字列の保存先パスを指定します。単に"D:\path\to\example.json"を JSON 内容を保存したいファイルパスに置き換えます。
この方法で Out-File を使用することで、効率的に JSON データをファイルに永続化し、将来の使用や共有を容易にします。このシンプルでありながら強力なテクニックは、PowerShell 環境内で JSON データを効果的に管理するために役立ちます。
ConvertTo-Json と Set-Content を使用して JSON 文字列をファイルに保存
JSON 文字列をファイルに保存するもう一つの方法は、Set-Content cmdlet を使用することです。Set-Content cmdlet は、データをファイルに書き込むための簡単な方法を提供し、JSON 文字列をディスクに保存するのに適した選択肢となります。
以下の例は、このプロセスを示します:
$MyJsonObject | ConvertTo-Json | Set-Content -Path "D:\path\to\example.json"
この例では、$MyJsonObject は ConvertTo-Json を使用して生成された JSON 文字列を含む変数を表しています。パイプライン(|)は、この JSON 文字列をファイルに書き込むために Set-Content に渡します。
-Path パラメータは、JSON 文字列の保存先パスを指定します。単に"D:\path\to\example.json"を JSON 内容を保存したいファイルパスに置き換えます。
ConvertTo-Json と Add-Content を使用して JSON 文字列をファイルに保存
PowerShell で JSON 文字列をファイルに保存するための別の方法は、Add-Content cmdlet を使用することです。これにより、既存のファイルに JSON 文字列を追加することができます。次の例は、この方法をどう実現するかを示します:
$MyJsonObject | ConvertTo-Json | Add-Content -Path "D:\path\to\example.json"
この例では、$MyJsonObject は ConvertTo-Json を使用して生成された JSON 文字列を含む変数を表しています。パイプライン(|)は、この JSON 文字列を -Path パラメータで指定されたファイルに追加するために Add-Content に渡します。
-Path パラメータは、JSON 文字列が追加されるファイルを示します。単に"D:\path\to\example.json"を JSON 内容を追加したいファイルパスに置き換えます。
Add-Content cmdlet は、既存のデータを上書きすることなくファイルに内容を追加または追加する便利な方法を提供します。これは、時間が経つにつれて更新または拡張する必要がある JSON 文字列を扱う際に特に便利です。
結論
この記事では、PowerShell オブジェクトを JSON 文字列に変換し、ConvertTo-Json cmdlet や Out-File、Set-Content、Add-Content などの他のファイル処理 cmdlet を使用してファイルに保存するプロセスを示しました。
これらのツールを活用することで、ユーザーは JSON データを効率的に扱い、データ管理、共有、さまざまなアプリケーションやシステムとの統合をスムーズに進めることができます。
Nimesha is a Full-stack Software Engineer for more than five years, he loves technology, as technology has the power to solve our many problems within just a minute. He have been contributing to various projects over the last 5+ years and working with almost all the so-called 03 tiers(DB, M-Tier, and Client). Recently, he has started working with DevOps technologies such as Azure administration, Kubernetes, Terraform automation, and Bash scripting as well.
