Home > Windows にまつわる e.t.c.

ConvertTo-Json のネストの罠


見事にはまったので、情報共有です。

 

皆さん JSON は使ってますか?

Rest API を叩く際に JSON は欠かせないですし、他のシステムにデータを渡す際にもちょいちょい使います。

PowerShell も Rest API を叩けますし、JSON も簡単に扱うことが出来ます。

オブジェクトや、ハッシュテーブルを JSON する場合は、ConvertTo-Json 一発ですね

$Hash = @{
    A = "123"
    B = "456"
}

$JSON = $Hash | ConvertTo-Json

 

コンバートされた JSON はこんな感じになります。

 

とても便利な ConvertTo-Json ですが、こいつネストが深くなるとコンバートが出来ないって恥ずかしながら知らなかったです。

例えばこんな感じ

$Hash = @{
    Level1 = @{
        Level2 = [array]@{
            Level3 = "aaa"
        }
    }
}

$JSON = $Hash | ConvertTo-Json

出力された JSON はこうなっています。

 

Level3 がコンバートされずに "System.Collections.Hashtable" となってしまいました。

当初これは仕様なのか? 自力で JSON にするか...
と途方にくれたのですが(実際に JSON にするコード書いちゃいました w)、ConvertTo-Json のオプションを確認すると -Depth ってオプションがあり、default 2 だそうで...

なるほど、では -Depth を 3 にするとどうなるか

$Hash = @{
    Level1 = @{
        Level2 = [array]@{
            Level3 = "aaa"
        }
    }
}

$JSON = $Hash | ConvertTo-Json -Depth 3

 

無事に Level3 もコンバートされました。

 

ConvertTo-Json を使う際は、-Depth オプションも気にかけましょうね。

ちなみに、ConvertFrom-Json にも -Depth ありますので、こちらも同様だと思います。

以上情報共有でした

 

back.gif (1980 バイト)

home.gif (1907 バイト)

Copyright © MURA All rights reserved.