• C# json格式的序列化与反序列化


    使用C#,来序列化对象成为Json格式的数据,以及如何反序列化Json数据到对象

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

    Json支持下面两种数据结构:

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

    Json有下面几种表现形式

         1.对象

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

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

         2.数组

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

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

         3.字符串

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

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

    好了,介绍完JSON,现在说正题,我们事先序列化和反序列化有三种方式:

    1.使用JavaScriptSerializer类

    2.使用DataContractJsonSerializer类

    3.使用JSON.NET类库

     先建立一个Student的对象

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Runtime.Serialization;
    
    namespace JsonSerializerAndDeSerializer
    {
        [DataContract]
       public class Student
        {
            [DataMember]
           public int ID { get; set; }
    
            [DataMember]
           public string Name { get; set; }
    
            [DataMember]
           public int Age { get; set; }
    
            [DataMember]
           public string Sex { get; set; }
        }
    }
    
    //Student实体中的契约 [DataMember],[DataContract],是使用DataContractJsonSerializer序列化和反序列化必须要加的,对于其他两种方式不必加,也可以的

    1.DataContractJsonSerializer

    DataContractJsonSerializer类帮助我们序列化和反序列化Json,他在程序集 System.Runtime.Serialization.dll下的System.Runtime.Serialization.Json命名空间里。

                Student stu = new Student()
                 {
                     ID = 1,
                     Name = "曹操",
                     Sex = "",
                     Age = 1000
                 };
                //序列化
                DataContractJsonSerializer js = new DataContractJsonSerializer(typeof(Student));
                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)))
                {
                    DataContractJsonSerializer deseralizer = new DataContractJsonSerializer(typeof(Student));
                    Student model = (Student)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(); 

    结果:

    2.JavaScriptJsonSerializer

    Student stu = new Student()
                   {
                       ID = 1,
                       Name = "关羽",
                       Age = 2000,
                       Sex = ""
                   };
    
                JavaScriptSerializer js = new JavaScriptSerializer();
                string jsonData = js.Serialize(stu);//序列化
                Console.WriteLine(jsonData);
    
    
                ////反序列化方式一:
                string desJson = jsonData;
                //Student model = js.Deserialize<Student>(desJson);// //反序列化
                //string message = string.Format("ID={0},Name={1},Age={2},Sex={3}", model.ID, model.Name, model.Age, model.Sex);
                //Console.WriteLine(message);
                //Console.ReadKey(); 
    
    
                ////反序列化方式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(); 

    结果:

    3.JSON.NET(性能最好)

     List<Student> lstStuModel = new List<Student>() 
                {
                
                new Student(){ID=1,Name="张飞",Age=250,Sex=""},
                new Student(){ID=2,Name="潘金莲",Age=300,Sex=""}
                };
    
                //Json.NET序列化
                string jsonData = JsonConvert.SerializeObject(lstStuModel);
    
                Console.WriteLine(jsonData);
                Console.ReadKey();
    
    
                //Json.NET反序列化
                string json = @"{ 'Name':'C#','Age':'3000','ID':'1','Sex':'女'}";
                Student descJsonStu = JsonConvert.DeserializeObject<Student>(json);//反序列化
                Console.WriteLine(string.Format("反序列化: ID={0},Name={1},Sex={2},Sex={3}", descJsonStu.ID, descJsonStu.Name, descJsonStu.Age, descJsonStu.Sex));
                Console.ReadKey(); 

    结果:

    最佳性能序列化库 Swifter.Json

    (1): 最优秀的整型和浮点型 ToString 和 Parse 方法实现。
    (2): Emit 实现的高性能对象映射工具。
    (3): 本地内存分配!拒绝 .Net 托管二次内存。
    (4): 使用线程缓存,让您的程序运行越久速度越快。
    (5): 内部全指针运算,相当于使用了 .Net Core 新技术 Span<T>!

    安装:Nuget

    代码示例

    (1): 简单使用

        public class Demo
        {
            public int Id { get; set; }
    
            public string Name { get; set; }
            
            public static void Main()
            {
                var json = JsonFormatter.SerializeObject(new { Id = 1, Name = "Dogwei" });
                var dictionary = JsonFormatter.DeserializeObject<Dictionary<string, object>>(json);
                var obj = JsonFormatter.DeserializeObject<Demo>(json);
            }
        }

    (2): 处理重复引用

        public class Demo
        {
            public int Id { get; set; }
    
            public string Name { get; set; }
    
            public Demo Instance { get; set; }
    
            public static void Main()
            {
                var jsonFormatter = new JsonFormatter(JsonFormatterOptions.MultiReferencingReference);
    
                var obj = new Demo() { Id = 1, Name = "Dogwei" };
    
                obj.Instance = obj;
    
                var json = jsonFormatter.Serialize(obj);
    
                var deser = jsonFormatter.Deserialize<Demo>(json);
    
                Console.WriteLine(json); // {"Id":1,"Instance":{"$ref":"#"},"Name":"Dogwei"}
    
                Console.WriteLine(deser.Instance == deser); // True
            }
        }

    (3): RWField 特性

    public class Demo
        {
            [RWField("First Name")]
            public string Name { get; set; }
    
            [RWField]
            public int Age;
    
            [RWField(Access = RWFieldAccess.Ignore)]
            public int Sex { get; set; }
            [RWField(Order = 1)]
            public int Id { get; set; }
    
            public static void Main()
            {
                var obj = new Demo() { Id = 1, Name = "Dogwei", Age = 22, Sex = 1 };
    
                var json = JsonFormatter.SerializeObject(obj);
    
                Console.WriteLine(json); // {"Id":1,"Age":22,"First Name":"Dogwei"}
            }
        }

    (4): 设置日期格式

    public class Demo
        {
            public static void Main()
            {
                var jsonFormatter = new JsonFormatter();
    
                jsonFormatter.SetDateTimeFormat("yyyy-MM-dd HH:mm:ss");
    
                var json = jsonFormatter.Serialize(DateTime.Now);
    
                Console.WriteLine(json); // "2019-02-13 11:03:46"
            }
        }

    (5): 自定义类型的行为

        public class Demo
        {
            public string Name { get; set; }
    
            public int Sex { get; set; }
    
            public bool IsMan { get => Sex == 1; }
    
            public unsafe static void Main()
            {
                var jsonFormatter = new JsonFormatter();
                
                jsonFormatter.SetValueInterface<bool>(new MyBooleanInterface());
    
                var obj = new Demo() { Name = "Dogwei", Sex = 1 };
    
                var json = jsonFormatter.Serialize(obj);
    
                Console.WriteLine(json); // {"IsMan":"yes","Name":"Dogwei","Sex":1}
            }
        }
    
        public class MyBooleanInterface : IValueInterface<bool>
        {
            public bool ReadValue(IValueReader valueReader)
            {
                var value = valueReader.ReadString();
    
                switch (value)
                {
                    case "yes":
                    case "true":
                        return true;
                    case "no":
                    case "false":
                        return false;
                    default:
                        return Convert.ToBoolean(value);
                }
            }
    
            public void WriteValue(IValueWriter valueWriter, bool value)
            {
                valueWriter.WriteString(value ? "yes" : "no");
            }
        }

    (6): 设置缓存大小

        public class Demo
        {
            public static void Main()
            {
                HGlobalCache.MaxSize = 1024 * 500; // 500KB
    
                var json = JsonFormatter.SerializeObject(new { MaxJsonLength = 256000 });
            }
        }

    (7): 序列化超大文件

    public class Demo
        {
            public static void Main()
            {
                var bigObject = new BigObject();
    
                using (FileStream fileStream = new FileStream("/BigObject.json", FileMode.Create, FileAccess.ReadWrite))
                {
                    using (StreamWriter streamWriter = new StreamWriter(fileStream))
                    {
                        JsonFormatter.SerializeObject(bigObject, streamWriter);
                    }
                }
            }
        }

    (8): 使用适用小型应用程序的 XObjectRW<T>

    public class Demo
        {
            public static void Main()
            {
                // Default (FastObjectInterface)    : 初始化开销较大,内存较大,性能优异。
                // XObjectInterface                 : 初始化开销小,内存占用少,性能也不错。
    
                ValueInterface.DefaultObjectInterfaceType = typeof(XObjectInterface<>);
    
                var json = JsonFormatter.SerializeObject(new { Id = 1, Name = "Dogwei" });
    
                Console.WriteLine(json); // {"Id":1,"Name":"Dogwei"}
            }
        }

     参考:https://www.cnblogs.com/caofangsheng/p/5687994.html

  • 相关阅读:
    jquery下拉菜单打开的同时,同行右边的图标变化
    echarts引入及应用
    好用又美观的时间控件
    C#不支持此安全协议
    python re模块中的函数
    python中的收集参数
    python常用操作符
    python 字符串中常用的内置函数
    VS2012停止工作解决办法
    Jqurey图片放大镜插件
  • 原文地址:https://www.cnblogs.com/zhang1f/p/11093461.html
Copyright © 2020-2023  润新知