• .NET中JSON的序列化和反序列化的3种方式


    首先普及一下小知识:

    JSON 和 JS 对象互转

        要实现从对象转换为 JSON 字符串,使用 JSON.stringify() 方法:

    var json = JSON.stringify({a: 'Vinkong', b: 'Sky'}); //结果是 '{"a": "Vinkong", "b": "Sky"}'

        要实现从 JSON 转换为对象,使用 JSON.parse() 方法:

    var obj = JSON.parse('{"a": "Vinkong", "b": "Sky"}'); //结果是 {a: 'Vinkong', b: 'Sky'}
    

      

    下面是提供Demo
    建立一个Student类

    using Newtonsoft.Json;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Runtime.Serialization;
    using System.Text;
    using System.Threading.Tasks;
    using System.Web.Script.Serialization;
    
    namespace ConsoleApplication1
    {
        [DataContract]//DataContractJsonSerializer方式必须加的契约
        class Student
        {
            
         
            private string Name;
            [DataMember]//DataContractJsonSerializer方式必须加的契约
            [ScriptIgnore]//使用JavaScriptSerializer方式标记不序列化的属性
            [JsonIgnore]//使用JSON.NET方式标记不序列化的属性
            public string _Name
            {
                get { return Name; }
                set { Name = value; }
            }
            [DataMember]
            private int  age;
    
            public int _Age
            {
                get { return age; }
                set { age = value; }
            }
            [DataMember]
            private string sex;
    
            public string _Sex
            {
                get { return sex; }
                set { sex = value; }
            }
    
        }
    }

    测试代码编写:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Web.Script.Serialization;
    using Newtonsoft.Json;
    using System.Runtime.Serialization;
    using System.Runtime.Serialization.Json;
    using System.IO;
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
    
                #region 第一种方式:使用JavaScriptSerializer方式
                Student stu = new Student();
                stu._Name = "vinkong";
                stu._Age = 15;
                stu._Sex = "";
                JavaScriptSerializer jsonSerialize = new JavaScriptSerializer();
                //使用JavaScriptSerializer方式需要引入的命名空间,这个在程序集System.Web.Extensions.dll.中 
                //using System.Web.Script.Serialization;
                //注:可用[ScriptIgnore] 标记不序列化的属性
                //对象序列化对象
                string strjson = jsonSerialize.Serialize(stu);
                //Json反序列化对象
                stu = jsonSerialize.Deserialize<Student>(strjson);
    
                Console.WriteLine("1.使用JavaScriptSerializer方式");
                Console.WriteLine("序列化:"+strjson);
                Console.WriteLine("反序列化:" + stu._Name + "" + " " + "" + stu._Age + "" + " " + " " + stu._Sex + "");
                #endregion
    
                #region 使用JSON.NET方式
                //使用Json.NET类库需要引入的命名空间 using Newtonsoft.Json;
                //注:可用[JsonIgnore]标记不序列化的属性
                Student stu2 = new Student();
                stu2._Name = "vinkong2";
                stu2._Age = 15;
                stu2._Sex = "";
                //对象序列化Json
                string strjson2 = JsonConvert.SerializeObject(stu2);
                //Json反序列化对象
                stu2 = JsonConvert.DeserializeObject<Student>(strjson2);
                Console.WriteLine("2.使用JSON.NET 方式");
                Console.WriteLine("序列化:" + strjson2);
                Console.WriteLine("反序列化:" + stu2._Name + "" + " " + "" + stu2._Age + "" + " " + " " + stu2._Sex + "");
                #endregion
    
                #region 使用DataContractJsonSerializer
                 //使用DataContractJsonSerializer方式需要引入的命名空间,在System.Runtime.Serialization.dll.中。
                 // using System.Runtime.Serialization.Json;
                 //实体中的契约[DataMember],[DataContract],是使用DataContractJsonSerializer序列化和反序列化必须要加的,对于其他两种方式可加可不加。
                Student stu3 = new Student();
                stu3._Name = "vinkong3";
                stu3._Age = 22;
                stu3._Sex = "";
    
                string strjson3 = "";
                //对象序列化Json
                using (MemoryStream stream = new MemoryStream())
                {
                    DataContractJsonSerializer jsonSerialize2 = new DataContractJsonSerializer(stu3.GetType());
                    jsonSerialize2.WriteObject(stream, stu3);
                    strjson3 = Encoding.UTF8.GetString(stream.ToArray());
                }
                //Json反序列化对象
                using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(strjson3)))
                {
                    DataContractJsonSerializer jsonSerialize3 = new DataContractJsonSerializer(typeof(Student));
                    stu3 = (Student)jsonSerialize3.ReadObject(stream);
                }
                Console.WriteLine("3.使用DataContractJsonSerializer 方式");
                Console.WriteLine("序列化:" + strjson3);
                Console.WriteLine("反序列化:" + stu3._Name + "" + " " + "" + stu3._Age + "" + " " + " " + stu3._Sex + "");
                Console.ReadKey();
                #endregion
    
              
            }
        }
    }

    尽量使用JSON.NET方式来序列化和反序列化,性能好。

  • 相关阅读:
    asyncio异步 loop.run_in_executor操作同步方法变成异步操作
    pandas水平拆分dataframe
    vscode 运行python程序设置参数
    dbeaver 连接oracle11g 驱动问题
    python3 使用数据描述器,验证字段类型
    postgres 列转行操作记录
    python3 读取照片写入数据库postgres
    个人作业——软件工程实践总结作业
    2019 SDN上机第7次作业
    2019 SDN上机第6次作业
  • 原文地址:https://www.cnblogs.com/Vinkong/p/12599013.html
Copyright © 2020-2023  润新知