PowerShellではCmdletを介してJSONの利用ができます。型に当てずに解釈できるので、さくっと使うには本当に強力です。この点に関しては、jq
やjq
などより触りやすいと思います。
さて、過去にも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にするか、ConvertTo-Json -Compress
とするかなどがあります。ようは、 ConvertTo-Json -Compress
ではなくConvertTo-Json -Compress
として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:これはあまりにもアレで好きじゃない