2011/05/15
JavaScriptSerializerを使ってJSONをパース/作成
PowerShellでJScript.NETを利用してJSONをパースするの続きです。
あれからまた色々調べていると、.NET Framework 3.5から追加されたSystem.Web.Script.Serialization.JavaScriptSerializerクラスを用いるとJSONのパースと作成が簡単に行えることがわかりました。
まずはパースから。
$json=@' {"items": [ { "code":25, "name":"ハードディスク2TB", "price":7000 }, { "code":56, "name":"メモリ8GB", "price":8000 }, { "code":137, "name":"23インチ液晶ディスプレイ", "price":35000 } ] } '@ Add-Type -AssemblyName System.Web.Extensions $serializer=new-object System.Web.Script.Serialization.JavaScriptSerializer $obj=$serializer.DeserializeObject($json) $obj["items"][1]["name"] #「メモリ8GB」と表示される $obj.items[1].name # 上と同じ $obj["items"]|%{$_["name"]} # 名前が列挙される
このように、JavaScriptSerializerをNew-Objectして、DeserializeObjectメソッドを呼ぶだけで、JSONをパースした結果がオブジェクトに格納されます。このときJSオブジェクトはDictionary<string,object>に、JS配列はobject[]にされて格納されます。よってオブジェクトのアクセスは前回JScript.NETを使った場合と同様にパラメータ付プロパティでできますし、配列のアクセスは数値の添え字で可能です。
前回に比べて良くなっている点は、DictionaryなのでPowerShellにおける連想配列と同様に、プロパティアクセスが可能である点です。よって、$obj.items[1].nameのようにドット演算子で楽に値を取得できます。
さらにJS配列はオブジェクト配列として格納されています。よって、foreachすればその要素がそのまま列挙できます。前回に比べて素直なコードになっていることが分かると思います。
.NET 3.5が使える環境ではPowerShellでJSONをパースするにはJavaScriptSerializerが本命なんじゃないかなと思います。
そしてJavaScriptSerializerクラスを使うと、JSON文字列を作成することも容易です。ここでは先程の例のJSONを逆にPowerShellで作ってみます。
Add-Type -AssemblyName System.Web.Extensions $serializer=new-object System.Web.Script.Serialization.JavaScriptSerializer $serializer.Serialize( @{items= @( @{ code=25; name="ハードディスク2TB"; price=7000 }, @{ code=56; name="メモリ8GB"; price=8000 }, @{ code=137; name="23インチ液晶ディスプレイ"; price=35000 } ) })
このように、Serializeメソッドの引数にPowerShellの連想配列を渡すだけです。連想配列の要素に連想配列や配列を含むことで、オブジェクトを構築していきます。
これを実行すると結果は次のようになります。
{"items":[{"name":"ハードディスク2TB","code":25,"price":7000},{"name":"メモリ8GB","code":56,"price":8000},{"name":"23インチ液晶ディスプレイ","code": 137,"price":35000}]}
これは最初に示したJSONとまったく同じであることが分かると思います。このように非常に直感的かつ簡便にJSON文字列を作成することができます。PowerShellの連想配列と配列を使ってオブジェクトを組み立てるだけなので、難しいことを考える必要はなく、柔軟性も高いです。JSONの作成もJavaScriptSerializerが本命でしょうね。JavaScriptSerializerはPowerShellとの相性が抜群です。
元記事:http://blogs.wankuma.com/mutaguchi/archive/2011/05/15/199058.aspxプライバシーポリシー