JavaScriptSerializerを使ってJSONをパース/作成 - PowerShell Scripting Weblog

2011/05/15

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

トラックバック

トラックバックはまだありません

トラックバックPing:


コメント

コメントはまだありません


コメントをどうぞ

名前 (省略可) :
E-mail or URL (省略可) :


前の記事へ | 次の記事へ

Copyright © 2005-2016 Daisuke Mutaguchi All rights reserved

mailto: mutaguchi at roy.hi-ho.ne.jp

Awards

Books

Twitter