もはや json を利用するのが PowerShell では最も楽な方法と思っています、今日この頃です。 以前は csv でも楽だなーとか気の迷いがありましたが、 再利用するデータなら 絶対に json です。 ということで、今回は PowerShell で json 出力と 読み込みを。 以前書いた、これとかも参考にどうぞ。 PowerShellでJSONを触ってみる(続き)
JSONへの変換 とファイル書き出し
これは以前も書いた通りです。 ConvertTo-Json を利用します。
[System.Net.IPAddress]::Any | ConvertTo-Json
出力されますね。
{ "Address": 0, "AddressFamily": 2, "ScopeId": null, "IsIPv6Multicast": false, "IsIPv6LinkLocal": false, "IsIPv6SiteLocal": false, "IsIPv6Teredo": false, "IsIPv4MappedToIPv6": false, "IPAddressToString": "0.0.0.0" }
これだけです。 もし 1 string に集約するなら ConvertTo-Json -Compress スイッチと指定します。
[System.Net.IPAddress]::Any | ConvertTo-Json -Compress
出力されました。
{"Address":0,"AddressFamily":2,"ScopeId":null,"IsIPv6Multicast":false,"IsIPv6LinkLocal":false,"IsIPv6SiteLocal":false,"IsIPv6Teredo":false,"IsIPv4MappedToIPv6":false,"IPAddressToString":"0.0.0.0"}
ファイルに書き出すなら、この後ろに Out-File を付ければいいでしょう。 (Set-Content でもいいですけど)
[System.Net.IPAddress]::Any | ConvertTo-Json | Out-File d:\hogehoge.json -Encoding utf8 -Append
ファイル読み込みと JSON の変換
ファイルを読みだす時は、定番の Get-Content です。 そして、読み取った内容を JSON から Objectに再変換するのは ConvertFrom-Json です。
ConvertFrom-Json のみで出力したファイルの読み取り
まず、 一行ではなくKVで改行出力したJsonを読みとってみます。こんなjsonにします。
{ "Address": 0, "AddressFamily": 2, "ScopeId": null, "IsIPv6Multicast": false, "IsIPv6LinkLocal": false, "IsIPv6SiteLocal": false, "IsIPv6Teredo": false, "IsIPv4MappedToIPv6": false, "IPAddressToString": "0.0.0.0" }
読み取る際は、Get-Contentを使います。
ただし、Get-Content は 標準では対象ファイルを 一行ずつ読み取るため、改行が含まれたjsonを対象にした場合 jsonとして認識できません。
もし改行を含むjsonを読み取る場合は、Get-Content -Raw とします。 その上で、ConvertFrom-Jsonします。例えばこういう jsonですね。
Get-Content D:\hogehoge.json -Encoding UTF8 -Raw | ConvertFrom-Json
うまく読み取れましたね
Address : 0 AddressFamily : 2 ScopeId : IsIPv6Multicast : False IsIPv6LinkLocal : False IsIPv6SiteLocal : False IsIPv6Teredo : False IsIPv4MappedToIPv6 : False IPAddressToString : 0.0.0.0
-Raw を忘れると 改行を含んだファイルから、jsonをうまく認識できずオブジェクト 変換が出来ないので注意してください。
ConvertFrom-Json -Compress で出力したファイルの読み取り
json 形式を一行に集約する -Compress を付けたファイルを読み取ってみましょう。
[System.Net.IPAddress]::Any | ConvertTo-Json -Compress | Out-File d:\hogehoge.json -Encoding utf8 -Append
この場合、 Get-Content のデフォルト動作である 一行毎に読み取る方法がそのまま使えます。その上で、ConvertFrom-Jsonします。
Get-Content D:\hogehoge.json -Encoding UTF8 | ConvertFrom-Json
Address : 0 AddressFamily : 2 ScopeId : IsIPv6Multicast : False IsIPv6LinkLocal : False IsIPv6SiteLocal : False IsIPv6Teredo : False IsIPv4MappedToIPv6 : False IPAddressToString : 0.0.0.0
まとめ
ファイルに書き出したjsonを読む場合、Compressしなかった場合は、 -Raw を付ける。
ConvertTo-Json | Out-File $path Get-Content $path -Raw | ConvertFrom-Json
Compressした場合は、 -Raw はいらない
ConvertTo-Json -Compress | Out-File $path Get-Content $path | ConvertFrom-Json
簡単です。json はやはり楽ですにぇ。PowerShell では、jsonを読んだらオブジェクトとして扱えるので、かなり気持ちよく書けるでしょう。そう、jq では味わえないぐらい簡単に。
ファイル書き出ししなかった場合は、特に気にすることなく ConvertFron/To で変換できます。