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:これはあまりにもアレで好きじゃない