[.net 面向對象程序設計進階] (12) 序列化(Serialization)(四) 快速掌握JSON的序列化和反序列化


[.net 面向對象程序設計進階] (12) 序列化(Serialization)(四) 快速掌握JSON的序列化和反序列化

本節導讀:

介紹JSON的結構,在JS中的使用。重點說明JSON如何在.NET中快帶序列化和反序列化。最后介紹在使用.NET序列化JSON過程中的注意事項。

讀前必備:

A.泛型       [.net 面向對象編程基礎]  (18) 泛型

B.LINQ使用  [.net 面向對象編程基礎] (20) LINQ使用

1. 關於JSON

JSON的全稱是”JavaScript Object Notation”,意思是JavaScript對象表示法,它是一種基於文本,獨立於語言的輕量級數據交換格式。

2. 為什么要使用JSON

我們上節說的XML雖然也是一種通用的跨平台數據交換格式,為什么不用呢?

A.在Javascript中序列化和反序列化XML相當不方便。而Js中JSON可以非常方便的反序列化為對象。

B.在移動應用中,XML擁有過多的標記,比較占用流量,而JSON幾乎沒有任何標記。

3. JSON兩種格式

JSON有兩種格式:對象和數組(集合)

我們先看一下這兩種格式:

對象:

{
    "kongfuName": "獨孤九劍",
    "lethality": 100
}

數組(集合):

[
    {
        "kongfuName": "獨孤九劍",
        "lethality": 100
    },
    {
        "kongfuName": "易筋經",
        "lethality": 100
    }
]

4. JSON字符串

JSON字符串,就是將符合以上兩種格式的字符串

如:var jsonStr=”[{'kongfuName':'獨孤九劍','lethality':100},{'kongfuName':'易筋經','lethality':100}]”;

5. Javasctip中反序列化JSON

JQuery中提供的反序列化方法:

var obj = jQuery.parseJSON('{"name":"John"}');alert( obj.name === "John" );

6. .NET自帶的兩種JSON序列化

下面分別舉例說明,還是采用我們之前的“武林大俠”“武功”實體類為例,先定義兩個類,如下:

兩個類定義:

/// <summary>
/// 類:武林高手
/// MartialArtsMaster
/// </summary>
[DataContract]
public  class MartialArtsMaster
{
    [DataMember]
    /// <summary>
    /// 編號
    /// </summary>
    public int id { get; set; }
    [DataMember]
    /// <summary>
    /// 姓名
    /// </summary>
    public string name { get; set; }
    [DataMember]
    /// <summary>
    /// 年齡
    /// </summary>
    public int age { get; set; }
    [DataMember]
    /// <summary>
    /// 門派
    /// </summary>
    public string menpai { get; set; }
    [DataMember]
    /// <summary>
    /// 武學
    /// </summary>
    public List<Kongfu> kongFu { get; set; }
             
    /// <summary>
    /// 級別
    /// </summary>
    public int level { get; set; }
}

/// <summary>
/// 類:武學
/// Kongfu
/// </summary>
[DataContract]
public class Kongfu
{
    [DataMember]
    /// <summary>
    /// 武學名稱
    /// </summary>
    public string kongfuName { get; set; }

    [DataMember]
    /// <summary>
    /// 殺傷力
    /// </summary>
    public int lethality { get; set; }
}

增加幾個武林高手:

List<MartialArtsMaster> masterList = new List<MartialArtsMaster>();
//增加幾個武林高手
masterList.Add(new MartialArtsMaster()
{
    id = 1,
    name = "令狐沖",
    age = 23,
    menpai = "華山",
    kongFu = new List<Kongfu>() { new Kongfu() { kongfuName = "獨孤九劍", lethality = 100 }, new Kongfu() { kongfuName = "易筋經", lethality = 100 } },
    level = 10
});

masterList.Add(new MartialArtsMaster()
{
    id = 2,
    name = "黃葯師",
    age = 55,
    menpai = "桃花島",
    kongFu = new List<Kongfu>() { new Kongfu() { kongfuName = "彈指神通", lethality = 100 } },
    level = 10
});

masterList.Add(new MartialArtsMaster()
{
    id = 3,
    name = "段譽",
    age = 20,
    menpai = "天龍寺",
    kongFu = new List<Kongfu>() { new Kongfu() { kongfuName = "凌波微步", lethality = 100 }, new Kongfu() { kongfuName = "六脈神劍", lethality = 100 } },
    level = 10
});

masterList.Add(new MartialArtsMaster()
{
    id = 4,
    name = "喬峰",
    age = 33,
    menpai = "丐幫",
    kongFu = new List<Kongfu>() { new Kongfu() { kongfuName = "降龍十八掌", lethality = 100 }, new Kongfu() { kongfuName = "打狗棒法", lethality = 100 } },
    level = 10
});

6.1  DataContractJsonSerializer

程序集:System.Runtime.Serialization.dll

命名空間 System.Runtime.Serialization.Josn

類:DataContractJsonSerializer

6.1.1  DataContractJsonSerializer 序列化  

//程序集:System.Runtime.Serialization.dll
//命名空間 System.Runtime.Serialization.Josn
//類:DataContractJsonSerializer
System.Runtime.Serialization.Json.DataContractJsonSerializer masterJson = new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(List<MartialArtsMaster>));

           
string strJson = String.Empty;
//序列化
using (MemoryStream stream = new MemoryStream())
{
    masterJson.WriteObject(stream, masterList);
    strJson = Encoding.UTF8.GetString(stream.ToArray());
}
Console.WriteLine(strJson);

 運行結果如下:

注意:此種序列化,需要給類加上標記 

6.1.2  DataContractJsonSerializer反序列化  

//反序列化
List<MartialArtsMaster> newMasterList = new List<MartialArtsMaster>();
using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(strJson)))
{
    DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(List<MartialArtsMaster>));
    newMasterList = (List<MartialArtsMaster>)serializer.ReadObject(ms);
}
string result = String.Empty;           

Func<List<Kongfu>,string> kongFu = delegate (List<Kongfu> kongfu) { string kflist = String.Empty; kongfu.ForEach(m => kflist += "武功名稱:" + m.kongfuName + ";殺傷力" + m.lethality+"\n"); return kflist; };
newMasterList.ForEach(m => result += "大俠編號:" + m.id + " 大俠名字:" + m.name + " 年齡:" + m.age + " 門派:" + m.menpai + " \n所學武功:\n" + kongFu(m.kongFu));

Console.WriteLine(result);

 運行結果如下:

6.2 Serialization,Deserialize

程序集:System.Web.Extensions.dll

命名空間:System.Web.Script.Serialization

類:Serialization,Deserialize

6.2.1 Serialization 序列化 

//程序集:System.Web.Extensions.dll
//命名空間:System.Web.Script.Serialization
//類:Serialization,Deserialize
JavaScriptSerializer jsonSerializer = new JavaScriptSerializer();
//執行序列化
string strJson2 = jsonSerializer.Serialize(masterList);
Console.WriteLine(strJson2);

 運行結果如下:

 6.2.2 Deserialize 反序列化 

//執行反序列化     
JavaScriptSerializer jsonSerializer = new JavaScriptSerializer();
List<MartialArtsMaster> newMasterList = jsonSerializer.Deserialize<List<MartialArtsMaster>> (strJson2);
string result = String.Empty;

Func<List<Kongfu>, string> kongFu = delegate (List<Kongfu> kongfu) { string kflist = String.Empty; kongfu.ForEach(m => kflist += "武功名稱:" + m.kongfuName + ";殺傷力" + m.lethality + "\n"); return kflist; };
newMasterList.ForEach(m => result += "大俠編號:" + m.id + " 大俠名字:" + m.name + " 年齡:" + m.age + " 門派:" + m.menpai + " \n所學武功:\n" + kongFu(m.kongFu));

Console.WriteLine(result);

 運行結果如下:

 7. 注意事項:

可以使用IgnoreDataMember:指定該成員不是數據協定的一部分且沒有進行序列化

DataMember:定義序列化屬性參數

使用DataMember屬性標記字段必須使用DataContract標記類否則DataMember標記不起作用。

默認情況下,不允許序列化。因此使用上述類進行序列化或反序列化時,一定要給類加上標記[DataContract]。

而使用第DataContractJsonSerializer,則不需要。

因此:

使用類:Serialization,Deserialize(命名空間:System.Web.Script.Serialization),可以實現快速序列化。

使用類:DataContractJsonSerializer,可以通過標記那些屬性或字段需要序列化,進行局部序列化。

8.本節要點:

A.認識JSON:Javascript表示法,一種跨平台、輕量級數據交換格式;

B.認識JSON的兩種格式

C.掌握在JS中使用JSON

D.掌握使用.NET自帶的兩個類進行JSON序列化和反序列化

使用類:Serialization,Deserialize(命名空間:System.Web.Script.Serialization),可以實現快速序列化。

使用類:DataContractJsonSerializer,可以通過標記那些屬性或字段需要序列化,進行局部序列化。

==============================================================================================  

 返回目錄

 <如果對你有幫助,記得點一下推薦哦,如有有不明白或錯誤之處,請多交流>  

<對本系列文章閱讀有困難的朋友,請先看《.net 面向對象編程基礎》>

<轉載聲明:技術需要共享精神,歡迎轉載本博客中的文章,但請注明版權及URL>

.NET 技術交流群:467189533    .NET 程序設計

==============================================================================================   


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM