Pebble's Diary

プログラマーの作業メモ

C# Microsoft純正ライブラリでJSONをdeserializeする

C#JSONをserialize/deserializeする方法として、Microsoftが提供するライブラリを使う場合、2種類の方法がある。

1) DataContractJsonSerializer

Namespace: System.Runtime.Serialization.Json
AssemblySystem.Runtime.Serialization

2) JavaScriptSerializer

Namespace: System.Web.Script.Serialization
Assembly: System.Web.Extensions

1)の方はJSONに対応するモデルクラスを経由して変換する方法。
2)の方は1) の方法に加えて、モデルクラスを経由せずにダイナミックな変数を経由して変換する方法が使える。

この記事ではモデルクラスを作らずにdeselializeする方法を紹介する。

var jsonstring = "{cast:[{id:1, name:\"harry\"},{id:2, name:\"hermione\"}]}";
Debug.Print(jsonstring);
var serializer = new JavaScriptSerializer();
dynamic json = serializer.DeserializeObject(jsonstring);
dynamic cast = json["cast"];
foreach (var obj in cast)
{
    if (obj.ContainsKey("unknowntag"))
    {
        Debug.Assert(false); 
    } else
    {
        Debug.Assert(true);
    }
    if (obj.ContainsKey("name"))
    {
        Debug.Assert(true);
    } else
    {
        Debug.Assert(false);
    }
    int id = obj["id"];
    Debug.Print("{0}", id);
    string s = obj["name"];
    Debug.Print("{0}", s);
}
{cast:[{id:1, name:"harry"},{id:2, name:"hermione"}]}
1
harry
2
hermione

以上である。
注意するのは、型が確定していない部分では、varではなくdynamicで受けるという点である。
dynamicというのはC#で動的に型が決定されるという恐ろしい代物であるが(導入されたのは2010年頃)、
jsonとはすこぶる相性がいい。というか、これがないとJavaScript, Ruby, Swiftと勝負できない。
ContainsKeyの呼び出しによって、keyがふくまれるかどうかも判定することができる。
もちろん、不定な動作をしたときは例外が発生するので、例外のキャプチャは必須であろう。