tech.guitarrapc.cóm

Technical updates

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

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

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

https://tech.guitarrapc.com/entry/2013/03/04/210313

https://tech.guitarrapc.com/entry/2013/08/10/220803

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

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

https://tech.guitarrapc.com/entry/2013/08/10/220803

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

サンプル

https://gist.github.com/guitarrapc/f678885948596fb13c30

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

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

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

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

https://tech.guitarrapc.com/entry/2015/01/20/034358

https://gist.github.com/guitarrapc/d797c29529d23af34ab1

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

まとめ

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

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