JSON(ジェーソン)の編集はエディタでもできるが、PowerShellからJSONを操作することもできる。具体的にはJSONをPowerShellのカスタムオブジェクトとして読み込み、PowerShellで処理を行う。元のJSONファイルを書き換える必要がなければ、一部を取り出して、加工して他の形式に持っていくことも可能だ。
JSONをPowerShellで扱うのは、窓辺の小石(34) Excel vs JSONで解説したが、あくまでもExcelに読む込むための前処理としてだった。今回は、もう少し幅を広げて、PowerShell内でJSONを扱う方法を考える。
トップレベルのプロパティを確認
JSONでは、階層構造のある複雑なオブジェクトを定義することができる。単純な要素としては、文字列、数値、真偽値、ヌル値があり、内部に複数要素を持つ要素としては、配列とオブジェクトがある。オブジェクトは、キーと値の組み合わせをカンマで区切って列挙したもの。PowerShellで読み込むとJSONのオブジェクトは、「PSCustomObject」になり、配列は、BaseTypeがArrayのObject[]になる。
まずは、JSONファイルを読み込む。ここでは、サンプルのJSONファイルとしてWindows Terminalの設定ファイルを使ってみる。
#_空行
$j=Get-Content .\settings.json | ConvertFrom-Json
$jをそのまま表示させれば、トップレベルのプロパティ(JSONオブジェクトのキー)が表示される。$jと、このプロパティ名を組み合わせればプロパティの値を得ることができる。プロパティ名だけを得たいなら、
$pn=($j | Get-Member -MemberType Properties).Name
とする。
次にトップレベルプロパティのタイプを調べてみる(写真01)。
$pn | %{ "$($j.$_.gettype().name)`t`t$_" }
-
写真01: JSONファイルを読み込んでPowerShellのオブジェクトにして$jに、プロパティ名のリストを$pnに入れる。これをForeach-Object(エイリアスが%)のスクリプトブロックで「$j.$_」とすることで、プロパティの値を得ることができる。$_は、パイプラインから受け取るオブジェクトが代入される。
ここで、JSONプロパティの値が配列だったときにはObject[]、JSONのオブジェクトだったときには、PSCustomObjectになる。ただ、表示がガタガタなので、きれいに表示したいなら、(リスト01)のようにする。分かりやすいよう改行を入れているが、改行を入れずに1行でも構わない。こちらは、プロパティ名の値(Value)がArrayになっているものはJSONの配列、Objectは、JSONのオブジェクトである。
■リスト01
$pn | Foreach-Object{
$hash=@{};
$t=$J.$_.Gettype().name;
if($t -notlike "*object*"){ $hash.add($_,$t) }
else{$hash.add($_,$J.$_.gettype().basetype.name ) };
$hash
} | ft -AutoSize;
ここから先は、プロパティごとに対応する。たとえば、actionsは、少し複雑なJSONオブジェクトになるので、Format-Listを使ってプロパティをすべて表示させる。
$j.actions | format-list *
keybindingsを書き換えたいなら、$j.keybindingsに配列を代入すればよい。以下は、keybindingsを完全に消去するもの。「@()」は空の配列を意味する。
$j.keybindings=@()
上記のようにオブジェクトを書き換えたら、以下のようにして、JSONファイルに戻すことができる。
$j | ConvertTo-Json -Depth 100 >.\myfile.json
書き換えが正しくないとき、オリジナルのファイルを直接上書きすると問題が起きる可能性もある。一回、別の名前で保存して、オリジナルをバックアップしてから置き換えるぐらいの慎重さは必要。
今回のタイトルネタは、映画「13日の金曜日」シリーズである。なぜなら、ジェーソンが主人公だからである。Wikipediaによれば、同シリーズは、米国でもっとも成功した「フランチャイズ」の1つだという。フランチャイズとは、多数の派生作品やメディアが作られたシリーズ作品のこと。米国だと、スタートレックなどがフランチャイズと呼ばれる。日本では和製英語で「メディアミックス」という。