PowerShell ではCmdletを介して JSON の利用ができます。型に当てずに解釈できるので、さくっと使うには本当に強力です。この点に関しては、jq
や Json.Net
などより触りやすいと思います。
さて、過去にも PowerShell での JSON の操作について説明してきました。今回、PowerShell v5 において、v4までで面倒だった点が改善されたので紹介しましょう。
目次
v4までは改行を含んだJSON の読み取りには注意が必要だった
過去の記事でも説明しましたが、ConvertFrom-Json
でファイルに保存された Json ファイルを読み取る場合に注意が必要でした。
具体的には、以下のような改行を含む JSON を Get-Content Jsonファイルパス | ConvertFrom-Json
とするとエラーがでてました。
{ "Address": 0, "AddressFamily": 2, "ScopeId": null, "IsIPv6Multicast": false, "IsIPv6LinkLocal": false, "IsIPv6SiteLocal": false, "IsIPv6Teredo": false, "IsIPv4MappedToIPv6": false, "IPAddressToString": "0.0.0.0" }
これを回避するためには、ConvertTo-Json -Compress
と改行無しのJSON にするか、Get-Content -Raw
とするかなどがあります。ようは、 string[]
ではなく string
として JSONを解釈させる必要がありました。
例えば、-Compress
スイッチを付けると、↑のJSON は↓のようになります。
{"Address":0,"AddressFamily":2,"ScopeId":null,"IsIPv6Multicast":false,"IsIPv6LinkLocal":false,"IsIPv6SiteLocal":false,"IsIPv6Teredo":false,"IsIPv4MappedToIPv6":false,"IPAddressToString":"0.0.0.0"}
v5 では改行を含んだJSON も直接読めるように
v5 では、改行を含んだJSON も解釈できるようになりました。つまり、以下のJSON がそのまま ConvertFrom-Json
で解釈可能です。
{ "Address": 0, "AddressFamily": 2, "ScopeId": null, "IsIPv6Multicast": false, "IsIPv6LinkLocal": false, "IsIPv6SiteLocal": false, "IsIPv6Teredo": false, "IsIPv4MappedToIPv6": false, "IPAddressToString": "0.0.0.0" }
サンプル
v4 では、改行でエラーがでます。
v5 では、エラーが出ず解釈できます。
ただし、JSON をクラスに割り当てずに読み込む == 型情報を持たないので、パイプラインの先にプロパティを伝搬したりはできません。
あえてパイプラインの先に伝搬したいなら簡単なラッパー関数を用意するという手もあります。
一応これで、パイプラインの先にプロパティが伝搬します。*1
まとめ
JSON with PowerShell は便利なのでぜひぜひ。
*1:これはあまりにもアレで好きじゃない