.Net 下開發使用JSON

來源:互聯網
上載者:User

標籤: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相關書籍。   

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.