tech.guitarrapc.cóm

Technical updates

PowerShell v5 の ConvertFrom-Json では改行を含めたJSONが解釈可能に

PowerShell ではCmdletを介して JSON の利用ができます。型に当てずに解釈できるので、さくっと使うには本当に強力です。この点に関しては、jqJson.Net などより触りやすいと思います。

さて、過去にも PowerShell での JSON の操作について説明してきました。今回、PowerShell v5 において、v4までで面倒だった点が改善されたので紹介しましょう。

tech.guitarrapc.com

tech.guitarrapc.com

目次

v4までは改行を含んだJSON の読み取りには注意が必要だった

過去の記事でも説明しましたが、ConvertFrom-Json でファイルに保存された Json ファイルを読み取る場合に注意が必要でした。

tech.guitarrapc.com

具体的には、以下のような改行を含む 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"
}
サンプル

gist.github.com

v4 では、改行でエラーがでます。

v5 では、エラーが出ず解釈できます。

ただし、JSON をクラスに割り当てずに読み込む == 型情報を持たないので、パイプラインの先にプロパティを伝搬したりはできません。

あえてパイプラインの先に伝搬したいなら簡単なラッパー関数を用意するという手もあります。

tech.guitarrapc.com

gist.github.com

一応これで、パイプラインの先にプロパティが伝搬します。*1

まとめ

JSON with PowerShell は便利なのでぜひぜひ。

*1:これはあまりにもアレで好きじゃない