天天看點

JSON 序列化和反序列化——.net3.5自帶類庫實作

.net3.5提供了json對象序列化與反序列化的類。位置在:System.Runtime.Serialization.Json空間下。其中如果要應用這個空間還必須添加對

System.ServiceModel

System.ServiceModel.Web

這兩個庫檔案的引用。

參考實體類:Customer

public class Customer

{

   public int Unid { get; set; }

   public string CustomerName { get; set; }

}

DataContractJsonSerializer

将對象序列化為 JavaScript 對象表示法 (JSON),并将 JSON 資料反序列化為對象。無法繼承此類。

其中有個方法WriteObject,它的功能定義為:将對象序列化為 JavaScript 對象表示法 (JSON) 文檔

它有三個方法重載,其中一個為:

public override void WriteObject(Stream stream,Object graph)

它的功能描述這:将指定對象序列化為 JavaScript 對象表示法 (JSON) 資料,并将生成的 JSON 寫入流中

(一)序列化

public string ToJson(Customer customer)

     DataContractJsonSerializer ds = new DataContractJsonSerializer(typeof(Customer));

     MemoryStream ms=new MemoryStream(); 

     ds.WriteObject(ms, customer); 

     string strReturn=Encoding.UTF8.GetString(ms.ToArray());

     ms.Close();

     return strReturn;

建立類執行個體,通過它的WriteObject方法來向流寫入序列化的對象,再把流寫入到字元串中。就可以得到JSON對象。

測試一下:

Customer cc = new Customer {Unid=1,CustomerName="John" };

string strJson = ToJson(cc);

Console.WriteLine(strJson);

結果為:{"CustomerName":"John","Unid":1}

(二)反序列化

ReadObject方法,其描述為:反序列化 JSON(JavaScript 對象表示法)資料,并傳回反序列化的對象。

它有很多重載,現在通過一種:

public override Object ReadObject(Stream stream)

它從流中得到反序列化的對象。

public object FromJson(string strJson)

    DataContractJsonSerializer ds = new DataContractJsonSerializer(typeof(Customer));

    MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(strJson)); 

    return ds.ReadObject(ms);

測試:

string strJson="{\"CustomerName\":\"John\",\"Unid\":1}";

Customer c=FromJson(strJson) as Customer;

Console.WriteLine(c.Unid+" "+c.CustomerName);

(三)通過泛型方法對兩者進行修改

為了适應多類型執行個體的序列化與反序列化,通過泛型方法來實作。

public string ToJson<T>(T t)

    DataContractJsonSerializer ds = new DataContractJsonSerializer(typeof(T));

    MemoryStream ms = new MemoryStream(); 

    ds.WriteObject(ms, t); 

    string strReturn = Encoding.UTF8.GetString(ms.ToArray());

    ms.Close();

    return strReturn;

public T FromJson<T>(string strJson) where T:class

    return ds.ReadObject(ms) as T;

·反序列化時通過泛型限制來指定類型T為類類型。

string strJsons = ToJson<Customer>(cc);

Console.WriteLine(strJsons); 

Customer c = FromJson<Customer>(strJson);

部落格園大道至簡

http://www.cnblogs.com/jams742003/

轉載請注明:部落格園

繼續閱讀