もくじ
JSONファイルの読み込み
PowerShellで次のようなスクリプトを書くとJSONファイルがPowerShellオブジェクトとして読み込める。
$jsonContent = (Get-Content 読み込むJSONファイルのパス | ConvertFrom-Json)
次のように動作する。
- Get-ContentコマンドでJSONファイルのテキストデータを取得し、ConvertFrom-Jsonコマンドに引き渡す。
- ConvertFrom-JsonコマンドでテキストデータをJSON形式で解釈し、PowerShellオブジェクトに変換する。
- 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
次のように動作する。
- ConvertTo-JsonコマンドでPowerShellオブジェクト$jsonContentをJSON形式のテキストデータに変換し、Out-Fileコマンドに引き渡す。
- 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。