標籤:des class http ext get 使用
記得一本雜誌上說過,“程式員可以沒有空氣和水,但不能沒有xml和可樂”,在那個年代,xml的確非常重要的,像唯一的寵兒,現在呢,很多東西除了可以儲存成xml意外有時候也選擇json,甚至在設計組件時除了提供xml的資料介面,也會提供JSON的資料介面了;web程式中可以用,silverlight程式中也提供了一些基礎性支出;可見JSON的重要性了。有不少學生問我在.Net中JSON到底好用不好用?其實非常好用。 在用戶端,有個json2.js檔案提供的parse和stringify方法可以實現用戶端對json對象的解析和封裝,例如:function btn_onclick() {
var obj = new Object();
obj.Name = "老楊";
obj.Title = "CIO";
var x = JSON.stringify(obj);//json2.js檔案中提供的方法
$.post("ServerOrResource/TE.ashx", {"ob":x}, function (res) {
var hs = "姓名:" + res.Name + " 職務:" + res.Title; //可以直接通過屬性名稱來進行訪問。
$("#divA").html(hs);
}, "json");
}實際上,開始使用jquery後,parse方法已經很少使用了,只需要在最後指明 返回資料是 "json"即可。在服務端處理起來容易嗎?同樣是非常容易的,在.net3.5之前,一般使用第三方組件,好像叫 Newtonsoft.Json什麼的,在.net3.5 之後,可以封裝一個類來進行處理,例如:using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Runtime.Serialization.Json;/// <summary>
///JsonHelper 的摘要說明
/// </summary>
public class JsonHelper
{
public static string SerializeObject(Object obj)
{
string json = "";
DataContractJsonSerializer ser = new DataContractJsonSerializer(obj.GetType());
using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
{
ser.WriteObject(ms, obj);
json = System.Text.Encoding.UTF8.GetString(ms.ToArray());
}
return json;
}
public static T DeSerializeObject<T>(string json)
{
System.Text.UTF8Encoding utf = new System.Text.UTF8Encoding();
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
using (System.IO.MemoryStream s = new System.IO.MemoryStream(utf.GetBytes(json)))
{
return (T)ser.ReadObject(s);
}
}
}除了涉及到泛型外,代碼還是非常容易看懂的吧。使用也非常容易,例如: public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
string json = context.Request.Form["ob"];
Employee emp = JsonHelper.DeSerializeObject<Employee>(json);
string ret = JsonHelper.SerializeObject(emp);
context.Response.Write(ret);
}需要注意的是 Employee是個自訂的實體類。
public class Employee
{
string name = "";
public string Name
{
get { return name; }
set { name = value; }
}
string title = "";
public string Title
{
get { return title; }
set { title = value; }
}
}有不少學員喜歡在實體類上加[Serializable],這時可要小心了,加上這個標記的化,JsonHelper.SerializeObject 結果中使用的是 Employee中變數名稱(例如:name、title)而非屬性(例如:Name、Title),JsonHelper.DeSerializeObject方法要求傳遞過來的json字串也必須是變數名稱格式的。當然您可以選擇不用[Serializable]標記,但是有時候別的功能可能希望進行序列化,為瞭解決這個問題,您可以使用如下方式來定義 Employee:[System.Runtime.Serialization.DataContract]
public class Employee
{
string name = "";
[System.Runtime.Serialization.DataMember]
public string Name
{
get { return name; }
set { name = value; }
}
string title = "";
[System.Runtime.Serialization.DataMember]
public string Title
{
get { return title; }
set { title = value; }
}
}這樣的化有不少好處: 用戶端和伺服器都可以依據 屬性名稱 ,輕鬆實現序列化和還原序列化。 WCF中,這樣的寫法就更常見了,想瞭解更多可以參考WCF相關書籍。