ASP.NET でJSON形式を提供するために JavaScriptSerializer

軽量なAJAXページを作ろうとすると、jQuery を使ってjavascriptを自分で書いたページに JSON でデータを渡したくなる。(すなわち ASP.NET AJAX を信じ切れていない俺)

でもって JSON データの提供だが、.NET Framework 3.5 では WCF を使えという方向になっていたようなのだが、これはこれでWeb.Config に設定を書かないといけないというのは、どうにもイケてない。提供するデータ形式を柔軟にする必要もないのに。

こっちとしては何かしらの決まった形式でのデータ提供しかしないんだからプレゼンテーションのためのさまざまなフックも必要なく、Httpハンドラでさくっと提供したい。ただしJSON形式への変換の部分は自分で作りたくない。

そんな時に JavaScriptSerializer 。.NET Framework 3.5 のマニュアルでは deplicated とマークがついているのが、 JavaScriptSerializer Undeprecated in .NET 3.5 SP1 だそうだ。これからも JavaScriptSerializer を使って大丈夫。 せっかくなので、Httpハンドラは IHttpAsyncHandler を使って非同期にするとスレッドが有効活用できるはず。

See these links for more information about the DataContractJsonSerializer:

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {       
        Customer person = new Customer();
        person.Name = "John Jones";
        person.Entered = new DateTime(2007, 10, 10);

        person.Addresses.Add(new Address());
        person.Addresses.Add( new Address() );
       
        DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(Customer));       
        MemoryStream ms = new MemoryStream();
        ser.WriteObject(ms, person);       

        string json = Encoding.Default.GetString(ms.ToArray());
        ms.Close();
        Response.Write("<pre>" + Server.HtmlEncode(json) + "</pre>");
       

        // *** Start from scratch with deserialization       
        //ms = new FileStream(Server.MapPath("jsonoutput.txt"), FileMode.Open);
        ms = new MemoryStream(Encoding.Unicode.GetBytes(json));
       
        ser = new DataContractJsonSerializer(typeof(Customer));
        Customer person2 = ser.ReadObject(ms) as Customer;
        ms.Close();       

        Response.Write(person2.Name);
    }

    [Serializable]
    public class Customer
    {
        public string Name = "John";
        public DateTime Entered = DateTime.Now;
        public List<Address> Addresses = new List<Address>();       
    }

    [Serializable]
    public class Address
    {
        public string Street = "32 Kaiea Place";
        public string City = "Paia";
        public string State = "HI";
        public string Zip = "96779";

    }
}