読者です 読者をやめる 読者になる 読者になる

tech.guitarrapc.cóm

C#, PowerShell, Unity, Cloud, Serverless Technical Update and Features

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します。例えばこういう 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 で変換できます。