もはや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
できます。
※ -Raw
を忘れると改行を含んだファイルから、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
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
では味わえないぐらい簡単に。
ファイル書き出ししなかった場合は、特に気にすることなくConvertFrom/To-JSON
で変換できます。