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";
}
}