[.net 面向对象程序设计进阶] (12) 序列化(Serialization)(四) 快速掌握JSON的序列化和反序列化
[.net 面向对象程序设计进阶] (12) 序列化(Serialization)(四) 快速掌握JSON的序列化和反序列化
本节导读:
介绍JSON的结构,在JS中的使用。重点说明JSON如何在.NET中快带序列化和反序列化。最后介绍在使用.NET序列化JSON过程中的注意事项。
读前必备:
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>
==============================================================================================
版权声明:本博文原创发表于博客园,作者博客:YuBinfeng's Technology Blog
| |