[.net 面向對象程序設計進階] (12) 序列化(Serialization)(四) 快速掌握JSON的序列化和反序列化html
本節導讀:編程
介紹JSON的結構,在JS中的使用。重點說明JSON如何在.NET中快帶序列化和反序列化。最後介紹在使用.NET序列化JSON過程當中的注意事項。json
讀前必備:數組
A.泛型 [.net 面向對象編程基礎] (18) 泛型spa
B.LINQ使用 [.net 面向對象編程基礎] (20) LINQ使用.net
1. 關於JSON設計
JSON的全稱是」JavaScript Object Notation」,意思是JavaScript對象表示法,它是一種基於文本,獨立於語言的輕量級數據交換格式。3d
2. 爲何要使用JSONcode
咱們上節說的XML雖然也是一種通用的跨平臺數據交換格式,爲何不用呢?htm
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>
==============================================================================================