zoukankan      html  css  js  c++  java
  • [.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 程序设计

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

  • 相关阅读:
    Oracle基础知识整理
    linux下yum安装redis以及使用
    mybatis 学习四 源码分析 mybatis如何执行的一条sql
    mybatis 学习三 mapper xml 配置信息
    mybatis 学习二 conf xml 配置信息
    mybatis 学习一 总体概述
    oracle sql 语句 示例
    jdbc 新认识
    eclipse tomcat 无法加载导入的web项目,There are no resources that can be added or removed from the server. .
    一些常用算法(持续更新)
  • 原文地址:https://www.cnblogs.com/yubinfeng/p/4637165.html
Copyright © 2011-2022 走看看