はじめに
仕事でPowerShellを時々使っていますが、ファイルのコピーや削除、OSやハードウェア情報の取得などの操作が多く、JSONやCSVなどのテキストを解析することはそれほどありませんでした。
そこで「PowerShellだとどうやってJSONを解析するんだろう?」と思い立って、調べてみた結果をまとめてみました。
解析するJSON
- OSとプログラミング言語、RDBの種類をまとめたJSONを用意しました。
- ここではヒア文字列リテラル(ヒアドキュメント)を使って複数行でJSONを記述しています。
解析するJSON
$json = @"
{
"Name" : "nkojima",
"OS" : ["Windows", "Linux", "MacOS"],
"Language" : ["C", "C++", "Java", "C#", "PowerShell"],
"RDB" : {
"Oracle" : ["10g", "11g", "12c", "19c"],
"MySQL" : ["5.1", "5.5", "5.6", "8.0"],
"PostgreSQL" : ["9.x", "15.x"],
"SQLite" : ["3.x"]
}
}
"@
JSON形式の文字列からオブジェクトへの変換
- JSON形式のテキストからオブジェクト(カスタムPSObject)に変換するには、
ConvertFrom-Json
関数を使います。
オブジェクトへの変換
$jsonContent = ($json | ConvertFrom-Json)
簡単な解析
- オブジェクト(キーと値のペア)になっている部分は、メソッドチェーンのようにキーを指定します。
「Name」の要素を表示
$jsonContent.Name
実行結果
nkojima
-
$jsonContent.OS
のように、値が配列になっている場合は配列が返されます。
「OS」の要素のデータ型を表示
$jsonContent.OS.GetType()
実行結果
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array
- 配列になっている部分を1要素ずつ取得する場合は、要素番号を指定します。
-
foreach
を使う場合はこの限りではありません。
-
「Lanuguage」の値の2番目の要素を表示
$jsonContent.Language[2]
実行結果
Java
複雑な解析
- オブジェクトと配列が入れ子になっている構造を解析する場合、for文を使って解析することが多いと思いますが...
- オブジェクトの値が複数ある場合、これらの値を取り出すのに
{オブジェクト}.psobject.Properties
という構文を使っています。- もう少し単純な書き方が出来るとありがたいですが、現時点ではこれしか方法を見いだせていません。
DBの種類とバージョンを表示
foreach ($rdb in $jsonContent.RDB.psobject.Properties) {
foreach ($dbVersion in $rdb.Value) {
Write-Host "$($rdb.Name) : $($dbVersion)"
}
}
実行結果
Oracle : 10g
Oracle : 11g
Oracle : 12c
Oracle : 19c
MySQL : 5.1
MySQL : 5.5
MySQL : 5.6
MySQL : 8.0
PostgreSQL : 9.x
PostgreSQL : 15.x
SQLite : 3.x