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。

相關文章
相關標籤/搜索