[PowerShell] JSONファイルの読み書きの仕方、罠への対処も含めて

.net, .NET Core, JSON, PowerShell, PowerShell Core

もくじ

JSONファイルの読み込み

PowerShellで次のようなスクリプトを書くとJSONファイルがPowerShellオブジェクトとして読み込める。

$jsonContent = (Get-Content 読み込むJSONファイルのパス | ConvertFrom-Json)

次のように動作する。

  1. Get-ContentコマンドでJSONファイルのテキストデータを取得し、ConvertFrom-Jsonコマンドに引き渡す。
  2. ConvertFrom-JsonコマンドでテキストデータをJSON形式で解釈し、PowerShellオブジェクトに変換する。
  3. ConvertFrom-Jsonコマンドが出力したPowerShellオブジェクトを変数$jsonContentに格納する。

JSONファイルの中身が例えば次のようになっていたとしよう。

{
    "tanaka": {
        "taro": {
            "height": 120,
            "favorite-food": ["apple", "beef"]
        },
        "jiro": {
            "height": 100,
            "favorite-food": ["orange", "fish"]
        },
        "shin-ichi": {
            "height": 80,
            "favorite-food": ["tofu", "banana"]
        }
    }
}

このとき、tanakaのtaroのheightにアクセスしたければ次のようにする。

$jsonContent.tanaka.taro.height  # コンソールに 120 と表示される。

文字列の中で使いたければそのままではだめで、次のように $() で囲んでやる必要がある。

"田中太郎くんの身長は$($jsonContent.tanaka.taro.height)cmです。"

tanakaのtaroの"favorite-food"には途中にハイフンが入っているので、アクセスするためには次のようにダブルクオーテーションを使う。

$jsonContent.tanaka.taro."favorite-food"

次のように、ダブルクオーテーションの後にプロパティ名を続けてもOK。普通にアクセスできる。

$jsonContent.tanaka."shin-ichi".height    # コンソールに 80 と表示される。

JSONファイルの作成/上書き保存

次のように書くとPowerShellオブジェクトからJSONファイルが作成/上書き保存できる。

ConvertTo-Json $jsonContent | Out-File 作成するJSONファイルのパス -Encoding utf8

次のように動作する。

  1. ConvertTo-JsonコマンドでPowerShellオブジェクト$jsonContentをJSON形式のテキストデータに変換し、Out-Fileコマンドに引き渡す。
  2. Out-FileコマンドでテキストデータをJSONファイルに出力する。その際、UTF-8形式でエンコードする。

しかしConvertTo-Jsonコマンドには罠が存在するため、多くの場合このままでは使い物にならない。

ConvertTo-JsonコマンドのDepthパラメータについて公式の説明にあるが、

Depthパラメータの既定値が2であるため、普通に実行するとオブジェクトの2階層目までしかJSON化してくれない。

3階層目以降はファイルに反映されないのだ。

先ほどのJSONファイルの例でいうと、太郎くん、次郎くん、新一くんそれぞれの名前まではファイル化されても、

身長と好きな食べ物はファイルに一切反映されない。

こうした事態を避けるためには次のようにDepthパラメータに自分なりのきちんとした値を設定する必要がある。

ConvertTo-Json $jsonContent -Depth 32 | Out-File 作成するJSONファイルのパス -Encoding utf8

ちなみにJSONファイルの読み込みに使うConvertFrom-JsonコマンドにもDepthパラメータはあるが、

既定で1024が設定されているため基本的に気にしなくてOK。