tech.guitarrapc.cóm

Technical updates

PowerShellでJSONを触ってみる(続き)

前回の続きです。

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