C# Json的序列化和反序列化的三种方式总结

在C#中使用JSON的序列化和反序列化主要有三种方式:
json

1.使用DataContractJsonSerializer框架

2.使用JavaScriptSerializeride

3.使用JSON.NET类库性能

图片

咱们先来看看使用 DataContractJsonSerializer的状况

DataContractJsonSerializer类帮助咱们序列化和反序列化Json,他在程序集 System.Runtime.Serialization.dll下的System.Runtime.Serialization.Json命名空间里。此方法经常使用于在一些旧版本的.net框架中,如3.0,3.5等。spa

建立一个JSON帮助类.net

 
 
  1. using System.IO;  code

  2. using System.Runtime.Serialization.Json;  orm

  3. using System.Text;  对象


  4. namespace Dockty.Data  blog

  5. {  

  6.    public static class JsonHelper<T>  

  7.    {  

  8.        static JsonHelper()  

  9.        { }  


  10.        /// <summary>

  11.        /// 序列化为JSON对象

  12.        /// </summary>

  13.        /// <param name="obj"></param>

  14.        /// <returns></returns>

  15.        public static string WriteObject(T obj)  

  16.        {  

  17.            var serializer = new DataContractJsonSerializer(typeof(T));  

  18.            var mstream = new MemoryStream();  

  19.            serializer.WriteObject(mstream, obj);  

  20.            byte[] Bytes = new byte[mstream.Length];  

  21.            mstream.Position = 0;  

  22.            mstream.Read(Bytes, 0, (int)mstream.Length);  

  23.            return Encoding.UTF8.GetString(Bytes);  

  24.        }  


  25.        /// <summary>

  26.        /// JSON对象反序列化

  27.        /// </summary>

  28.        /// <param name="data"></param>

  29.        /// <returns></returns>

  30.        public static T ReadObject(string data)  

  31.        {  

  32.            var mstream = new MemoryStream(Encoding.UTF8.GetBytes(data));  

  33.            var serializer = new DataContractJsonSerializer(typeof(T));  

  34.            return (T)serializer.ReadObject(mstream);  

  35.        }  

  36.    }  

  37. }

使用

ArtTags tags = new ArtTags() { ArtID = 1, ID = 1, TagID = 1 };  //序列化string strTags = JsonHelper<ArtTags>.WriteObject(tags);  //反序列化ArtTags newTags = JsonHelper<ArtTags>.ReadObject(strTags);

再看看使用JavaScriptJsonSerializer的状况:

 
 
  1. //-----------------------------------------------------------------------------------------

  2. //使用JavaScriptSerializer方式须要引入的命名空间,这个在程序集System.Web.Extensions.dll.中

  3. using System.Web.Script.Serialization;

  4. //----------------------------------------------------------------------------------------

  5. #region 2.JavaScriptSerializer方式实现序列化和反序列化

  6.            Student stu = new Student()

  7.               {

  8.                   ID = 1,

  9.                   Name = "关羽",

  10.                   Age = 2000,

  11.                   Sex = "男"

  12.               };


  13.            JavaScriptSerializer js = new JavaScriptSerializer();

  14.            string jsonData = js.Serialize(stu);//序列化

  15.            Console.WriteLine(jsonData);



  16.            ////反序列化方式一:

  17.            string desJson = jsonData;

  18.            //Student model = js.Deserialize<Student>(desJson);// //反序列化

  19.            //string message = string.Format("ID={0},Name={1},Age={2},Sex={3}", model.ID, model.Name, model.Age, model.Sex);

  20.            //Console.WriteLine(message);

  21.            //Console.ReadKey();



  22.            ////反序列化方式2

  23.            dynamic modelDy = js.Deserialize<dynamic>(desJson); //反序列化

  24.            string messageDy = string.Format("动态的反序列化,ID={0},Name={1},Age={2},Sex={3}",

  25.                modelDy["ID"], modelDy["Name"], modelDy["Age"], modelDy["Sex"]);//这里要使用索引取值,不能使用对象.属性

  26.            Console.WriteLine(messageDy);

  27.            Console.ReadKey();

  28.            #endregion

最后看看使用JSON.NET的状况,引入类库(推荐使用):

图片

 
 
  1. //使用Json.NET类库须要引入的命名空间

  2. //-----------------------------------------------------------------------------

  3. using Newtonsoft.Json;

  4. //-------------------------------------------------------------------------


  5. #region 3.Json.NET序列化

  6.            List<Student> lstStuModel = new List<Student>()

  7.            {


  8.            new Student(){ID=1,Name="张飞",Age=250,Sex="男"},

  9.            new Student(){ID=2,Name="潘金莲",Age=300,Sex="女"}

  10.            };


  11.            //Json.NET序列化

  12.            string jsonData = JsonConvert.SerializeObject(lstStuModel);


  13.            Console.WriteLine(jsonData);

  14.            Console.ReadKey();



  15.            //Json.NET反序列化

  16.            string json = @"{ 'Name':'C#','Age':'3000','ID':'1','Sex':'女'}";

  17.            Student descJsonStu = JsonConvert.DeserializeObject<Student>(json);//反序列化

  18.            Console.WriteLine(string.Format("反序列化:ID={0},Name={1},Sex={2},Sex={3}", descJsonStu.ID, descJsonStu.Name, descJsonStu.Age, descJsonStu.Sex));

  19.            Console.ReadKey();

  20.            #endregion

总结:

在使用的简洁性及性能来看都是最后一种方法是最好的,不过有时咱们面向使用一些很是古老的项目的时候就可能须要使用到第一种方法DataContractJsonSerializer。

相关文章
相关标签/搜索