前回の続きです。
PowerShellでJSONを触ってみる
前回頑張ってJSONを読み取れるFunctionを作ったのですが、PowerShell V3.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って良く似てますね。
参考サイト
Invoke-RestMethod Invoke-WebRequest
ConvertTo-JSON ConvertFrom-JSON
powershell-from.jp - [コマンドレット] ConvertFrom-JSON
PowerShell 3.0ならJSON返すWeb API叩くのにInvoke-RestMethod使うとラクですよー。Invoke-RestMethod guitarrapc.azurewebsites.net/api/people
— 牟田口大介さん (@mutaguchi) 2013年2月20日
あとJSON←→PSObjectの相互変換はConvertTo-JSONとConvertFrom-JSONで。
— 牟田口大介さん (@mutaguchi) 2013年2月20日
JSONをPSObjectに変換せずJSON文字列のまま取得するには Invoke-WebRequest http://guitarrapc.azurewebsites.net/api/people|select -ExpandProperty Content で。
— 牟田口大介さん (@mutaguchi) 2013年2月20日