前回の続きです。
前回頑張ってJSONを読み取れるFunctionを作ったのですが、PowerShell 3.0では標準コマンドレットでJSONが扱えました。 牟田口先生には感謝です。 ====
RestAPIからJSONを取得するコマンドレット
このコマンドレットで簡単完了です。
Invoke-RestMethod <uri>
ということで、今回のサンプルならこうです。
Invoke-RestMethod http://guitarrapc.azurewebsites.net/api/people
たったこの一行で、作ったファンクションと同じ結果を取得できるのだから…3.0いいね! 合わせて、JSONをPSObjectに変換せずJSON文字列のまま取得するにはこれで
Invoke-WebRequest <uri> | select -ExpandProperty Content
ということで、今回のサンプルならこうです。
Invoke-WebRequest http://guitarrapc.azurewebsites.net/api/people | select -ExpandProperty Content
これで、だだっと取得できます。
[{"Id":1,"Name":"量産型ぎたぱそ1号"},{"Id":2,"Name":"量産型ぎたぱそ2号"},{"Id":3,"Name":"量産型ぎたぱそ3号"},{"Id":4,"N......
PSObjectとJSONの相互変換
PSObjectとJSONの相互変換もコマンドレットでサポートされています。 PSObjectからJSONへの変換は以下のコマンドレットです。
ConvertTo-JSON
逆にJSONからPSObjectへの変換は以下のコマンドレットです。
ConvertFrom-JSON
PSObjectからJSONへの変換を試みる
例えば、Get-Processの結果を、JSONに出力してみましょう。
$process = Get-Process | select Id, ProcessName, StartTime, Handle, PM, NPM, Path ConvertTo-JSON $process
抜粋結果です。
[
{
"Id": 3020,
"ProcessName": "atieclxx",
"StartTime": null,
"Handle": null,
"PM": 1875968,
"NPM": 11264,
"Path": null
},
{
"Id": 856,
"ProcessName": "atiesrxx",
"StartTime": null,
"Handle": null,
"PM": 827392,
"NPM": 6480,
"Path": null
},
{
"Id": 3904,
"ProcessName": "ZuneLauncher",
"StartTime": "\/Date(1362240332685)\/",
"Handle": 7748,
"PM": 1146880,
"NPM": 7168,
"Path": "C:\\Program Files\\Zune\\ZuneLauncher.exe"
}
]
JSONからPSObjectへの変換を試みる
逆に、JSONデータをPSObjectに変換することも簡単です。 先ほどJSONに変換したGet-Processの結果をPSObjectに再変換してみましょう。
$JSON = ConvertTo-JSON $process ConvertFrom-JSON $JSON
抜粋結果です。
Id : 3020 ProcessName : atieclxx StartTime : Handle : PM : 1875968 NPM : 11264 Path : Id : 856 ProcessName : atiesrxx StartTime : Handle : PM : 827392 NPM : 6480 Path : Id : 3904 ProcessName : ZuneLauncher StartTime : 2013/03/02 16:05:32 Handle : 8176 PM : 1146880 NPM : 7168 Path : C:\Program Files\Zune\ZuneLauncher.exe
まとめ
JSONもこわくない。Format-List形式とJSONって良く似てますね。