tech.guitarrapc.cóm

Technical updates

PowerShellでJSONをファイル入出力する

もはや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で変換できます。