你的位置:首页 > ASP.net教程

[ASP.net教程][.net 面向对象程序设计进阶] 序列化(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

我们上节说的

A.在Javascript中序列化和反序列化

B.在移动应用中,

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//类:DataContractJsonSerializerSystem.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,DeserializeJavaScriptSerializer 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 程序设计

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