2013年7月6日土曜日

[.NET]Dictionaryを素直?にJSONで出力する

.NET系でJSONを出力する場合、DataContractJsonSerializerというクラスがあり、これを使えばそれっぽく出力されます。
しかし、Dictionaryで持っている値を出力すると、なんかkeyとvalueの配列という残念な形式にシリアライズされてしまいます。
他にいい方法ないかなぁと思って調査してみたところ、.NET4.0以降では、もう一種類JSONのシリアライザがあるのがわかり、
試したところ、期待するような形式で出てきました。ということでコードはこんな感じ。


private void button1_Click(object sender, EventArgs e)
{
    // using System.Web.Script.Serialization;
    var json = new JsonData();
    json.item_key = "歴史";

    json.label_position["kentousi"] = new { key = 894, Message = "遣唐使" };
    json.label_position["kamakura1"] = new { key = 1192, Message = "鎌倉幕府" };
    json.label_position["kamakura2"] = new { key = 1185, Message = "鎌倉幕府" };
    json.label_position["gomi"] = new { key = "string", Message = new string[]{"array1","array2"} };

    var sel = new JavaScriptSerializer();
    System.Diagnostics.Debug.WriteLine(sel.Serialize(json));

}

class JsonData
{
    public string item_key;
    public Dictionary<string, Object> label_position = new Dictionary<string, Object>();
}
出力結果はこんな感じ。

{
    "item_key": "歴史",
    "label_position": {
        "kentousi": {
            "key": 894,
            "Message": "遣唐使"
        },
        "kamakura1": {
            "key": 1192,
            "Message": "鎌倉幕府"
        },
        "kamakura2": {
            "key": 1185,
            "Message": "鎌倉幕府"
        },
        "gomi": {
            "key": "string",
            "Message": [
                "array1",
                "array2"
            ]
        }
    }
}


DataContractJsonSerializerでは、匿名型をサポートしていないのに対して、JavaScriptSerializerはイケる。という特徴もありました。ということで、組み合わせの異なる型をガラガラとシリアライズする必要のあるサーバ機能的な物を作る場合、というか4以降ならJavaScriptSerializerがおすすめ。

0 件のコメント: