.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方式来序列化和反序列化,性能好。

猜你喜欢

转载自www.cnblogs.com/Vinkong/p/12599013.html