• Json 序列化以及反序列化的三种方式(二)


    1.什么是JSON?

    Json【javascript对象表示方法】,它是一个轻量级的数据交换格式,我们可以很简单的来读取和写它,并且它很容易被计算机转化和生成,它是完全独立于语言的

    2.Json支持下面两种数据结构

      • 键值对的集合--各种不同的编程语言,都支持这种数据结构;
      • 有序的列表类型值的集合--这其中包含数组,集合,矢量,或者序列,等等。

    3.Json有下面几种表现形式

    1对象

    一个没有顺序的“键/值”,一个对象以花括号“{”开始,并以花括号"}"结束,在每一个“键”的后面,有一个冒号,并且使用逗号来分隔多个键值对

     var user = "{'name':'Manas','gender':'Male','birthday':'1987-8-8'}";

    2.数组

    设置值的顺序,一个数组以中括号"["开始,并以中括号"]"结束,并且所有的值使用逗号分隔

    var user_Array = "[{'user': {'name':'Manas','gender':'Male','birthday':'1987-8-8'}}, {'user':{'name':'Mohapatra','Male':'Female','birthday':'1987-7-7'}}]";

    3.字符串

    任意数量的Unicode字符,使用引号做标记,并使用反斜杠来分隔。

    var user_String = "{"ID":1,"Name":"Manas","Address":"India"}";

    序列化和反序列化有三种方式:

    1. 使用JavaScriptSerializer
    2. 使用DataContractJsonSerializer
    3. 使用JSON.NET类库 

    我们先来看看使用 DataContractJsonSerializer的情况的引用

    //----------------------------------------------------------------------------------------------
    //使用DataContractJsonSerializer方式需要引入的命名空间,在System.Runtime.Serialization.dll.中
    using System.Runtime.Serialization.Json;
    //---

    再看看使用JavaScriptJsonSerializer的情况的引用

    //-----------------------------------------------------------------------------------------
    //使用JavaScriptSerializer方式需要引入的命名空间,这个在程序集System.Web.Extensions.dll.中
    using System.Web.Script.Serialization;
    //-------------------------------------------------------------------------

    最后看看使用JSON.NET的情况,引入类库:

    //使用Json.NET类库需要引入的命名空间
    //-----------------------------------------------------------------------------
    using Newtonsoft.Json;
    //-------------------------------------------------------------------------

    最后实战控制台代码:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Runtime.Serialization.Json;
    using System.IO;
    using System.Web.Script.Serialization;
    using Newtonsoft.Json;
    
    namespace Test_Control
    {
        public class Students
        {
            public int ID { get; set; }
            public string Name { get; set; }
            public int Age { get; set; }
            public string Sex { get; set; }
        }
        class Test2
        {
            static void Main(string[] args)
            {
                var user = "{'name':'Manas','gender':'Male','birthday':'1987-8-8'}";
    
                var user_Array = "[{'user': {'name':'Manas','gender':'Male','birthday':'1987-8-8'}}, {'user':{'name':'Mohapatra','Male':'Female','birthday':'1987-7-7'}}]";
    
                var user_String = "{"ID":1,"Name":"Manas","Address":"India"}";
    
                #region 1.DataContractJsonSerializer方式序列化和反序列化
                Students stu = new Students()
                {
                    ID = 1,
                    Name = "曹操",
                    Sex = "",
                    Age = 1000
                };
                //序列化
                DataContractJsonSerializer js = new DataContractJsonSerializer(typeof(Students));
                MemoryStream msObj = new MemoryStream();
                //将序列化之后的Json格式数据写入流中
                js.WriteObject(msObj, stu);
                msObj.Position = 0;
                //从0这个位置开始读取流中的数据
                StreamReader sr = new StreamReader(msObj, Encoding.UTF8);
                string json = sr.ReadToEnd();
                sr.Close();
                msObj.Close();
                Console.WriteLine(json);
    
                //反序列化
                string toDes = json;
                //string to = "{"ID":"1","Name":"曹操","Sex":"男","Age":"1230"}";
                using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(toDes)))
                {
                    //js 反序列化为对象
                    JavaScriptSerializer jss = new JavaScriptSerializer();
                    var str_Object = jss.Deserialize<Students>(toDes);
    
                    DataContractJsonSerializer deseralizer = new DataContractJsonSerializer(typeof(Students));
                    Students model = (Students)deseralizer.ReadObject(ms);//反序列化ReadObject
                    Console.WriteLine("ID=" + model.ID);
                    Console.WriteLine("Name=" + model.Name);
                    Console.WriteLine("Age=" + model.Age);
                    Console.WriteLine("Sex=" + model.Sex);
                }
                Console.ReadKey();
                答案
                    {"Age":1000,"ID":1,"Name":"曹操","Sex":""}
                    ID=1
                    Name=曹操
                    Age=1000
                    Sex=#endregion
    
                #region 2.JavaScriptSerializer方式实现序列化和反序列化
                Students stu = new Students()
                {
                    ID = 1,
                    Name = "关羽",
                    Age = 2000,
                    Sex = ""
                };
                JavaScriptSerializer js = new JavaScriptSerializer();
                string jsonData = js.Serialize(stu);//序列化
                Console.WriteLine(jsonData);
    
                //反序列化方式一:
                string desJson = jsonData;
                Students model = js.Deserialize<Students>(desJson);// //反序列化
                string message = string.Format("ID={0},Name={1},Age={2},Sex={3}", model.ID, model.Name, model.Age, model.Sex);
                Console.WriteLine(message);
    
                //反序列化方式2
                dynamic modelDy = js.Deserialize<dynamic>(desJson); //反序列化
                string messageDy = string.Format("动态的反序列化,ID={0},Name={1},Age={2},Sex={3}",
                 modelDy["ID"], modelDy["Name"], modelDy["Age"], modelDy["Sex"]);//这里要使用索引取值,不能使用对象.属性
                Console.WriteLine(messageDy);
                Console.ReadKey();
                答案
                    {"ID":1,"Name":"关羽","Age":2000,"Sex":""}
                    ID=1,Name=关羽,Age=2000,Sex=男
                    动态的反序列化,ID=1,Name=关羽,Age=2000,Sex=#endregion
    
                #region 3.Json.NET序列化
                List<Students> lstStuModel = new List<Students>() 
               {
                   new Students(){ID=1,Name="张飞",Age=250,Sex=""},
                   new Students(){ID=2,Name="潘金莲",Age=300,Sex=""}
               };
                //Json.NET序列化
                string jsonData = JsonConvert.SerializeObject(lstStuModel);
                Console.WriteLine(jsonData);
    
                //Json.NET反序列化
                string json = @"{ 'Name':'C#','Age':'3000','ID':'1','Sex':'女'}";
                Students descJsonStu = JsonConvert.DeserializeObject<Students>(json);//反序列化
                Console.WriteLine(string.Format("反序列化: ID={0},Name={1},Sex={2},Sex={3}", descJsonStu.ID, descJsonStu.Name, descJsonStu.Age, descJsonStu.Sex));
                Console.ReadKey();
    
                输出结果
                [{"ID":1,"Name":"张飞","Age":250,"Sex":""},{"ID":2,"Name":"潘金莲","Age":300,"Sex":""}]
                反序列化: ID=1,Name=C#,Sex=3000,Sex=#endregion
            }
        }
    }
  • 相关阅读:
    10月27日PHP加载类、设计模式(单例模式和工厂模式)、面向对象的六大原则
    数据解析2:JSON解析(2)
    数据解析2:JSON解析(1)
    数据解析1:XML解析(3)
    数据解析1:XML解析(2)
    数据解析1:XML解析(1)
    设计模式4:装饰模式(1)
    设计模式3:模板模式(1)
    设计模式2:工程模式(1)
    设计模式1:单例模式(1)
  • 原文地址:https://www.cnblogs.com/zhangtaotqy/p/8194672.html
Copyright © 2020-2023  润新知