• [.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+"
    "); return kflist; };
    newMasterList.ForEach(m => result += "大侠编号:" + m.id + " 大侠名字:" + m.name + " 年龄:" + m.age + " 门派:" + m.menpai + " 
    所学武功:
    " + 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 + "
    "); return kflist; };
    newMasterList.ForEach(m => result += "大侠编号:" + m.id + " 大侠名字:" + m.name + " 年龄:" + m.age + " 门派:" + m.menpai + " 
    所学武功:
    " + 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 程序设计

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

  • 相关阅读:
    1856: [Scoi2010]字符串(Catalan数)
    11.6NOIP模拟赛
    bzoj1257[CQOI2007]余数之和(除法分块)
    11.5NOIP模拟赛
    bzoj1048(记忆化搜索)
    置顶公告+更新日志
    CF585F Digits of Number Pi
    [SHOI2007]善意的投票
    [HEOI2015]最短不公共子串
    树形背包复杂度+P3177 [HAOI2015]树上染色
  • 原文地址:https://www.cnblogs.com/yubinfeng/p/4637165.html
Copyright © 2020-2023  润新知