1. 程式人生 > >在C#中,Json的序列化和反序列化的幾種方式總結

在C#中,Json的序列化和反序列化的幾種方式總結

在這篇文章中,我們將會學到如何使用C#,來序列化物件成為Json格式的資料,以及如何反序列化Json資料到物件。

首先,解釋一下json 

Json【javascript物件表示方法】,它是一個輕量級的資料交換格式,我們可以很簡單的來讀取和寫它,並且它很容易被計算機轉化和生成,它是完全獨立於語言的。

Json支援下面兩種資料結構:

  • 鍵值對的集合--各種不同的程式語言,都支援這種資料結構;
  • 有序的列表型別值的集合--這其中包含陣列,集合,向量,或者序列,等等。

Json有下面幾種表現形式

     1.物件

  一個沒有順序的“鍵/值”,一個物件以花括號“{”開始,並以花括號"}"結束,在每一個“鍵”的後面,有一個冒號,並且使用逗號來分隔多個鍵值對。例如:

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

     2.陣列

設定值的順序,一個數組以中括號"["開始,並以中括號"]"結束,並且所有的值使用逗號分隔,例如:

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

     3.字串

任意數量的Unicode字元,使用引號做標記,並使用反斜槓來分隔。例如:

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

好了,介紹完JSON,現在說正題,我們事先序列化和反序列化有三種方式:

1.使用JavaScriptSerializer類

2.使用DataContractJsonSerializer類

3.使用JSON.NET類庫

我們先來看看使用 DataContractJsonSerializer的情況

DataContractJsonSerializer類幫助我們序列化和反序列化Json,他在程式集 System.Runtime.Serialization.dll

下的System.Runtime.Serialization.Json名稱空間裡。

首先,這裡,我新建一個控制檯的程式,新建一個類Student

複製程式碼
 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 using System.Runtime.Serialization;
 7 
 8 namespace JsonSerializerAndDeSerializer
 9 {
10     [DataContract]
11    public class Student
12     {
13         [DataMember]
14        public int ID { get; set; }
15 
16         [DataMember]
17        public string Name { get; set; }
18 
19         [DataMember]
20        public int Age { get; set; }
21 
22         [DataMember]
23        public string Sex { get; set; }
24     }
25 }
複製程式碼

注意:上面的Student實體中的契約 [DataMember],[DataContract],是使用DataContractJsonSerializer序列化和反序列化必須要加的,對於其他兩種方式不必加,也可以的。

我們程式的程式碼:

要先引用程式集,在引入這個名稱空間

1 //----------------------------------------------------------------------------------------------
2 //使用DataContractJsonSerializer方式需要引入的名稱空間,在System.Runtime.Serialization.dll.中
3 using System.Runtime.Serialization.Json;
4 //--------------------------------------------------------------------------------------------
複製程式碼
 1 #region 1.DataContractJsonSerializer方式序列化和反序列化
 2             Student stu = new Student()
 3              {
 4                  ID = 1,
 5                  Name = "曹操",
 6                  Sex = "",
 7                  Age = 1000
 8              };
 9             //序列化
10             DataContractJsonSerializer js = new DataContractJsonSerializer(typeof(Student));
11             MemoryStream msObj = new MemoryStream();
12             //將序列化之後的Json格式資料寫入流中
13             js.WriteObject(msObj, stu);
14             msObj.Position = 0;
15             //從0這個位置開始讀取流中的資料
16             StreamReader sr = new StreamReader(msObj, Encoding.UTF8);
17             string json = sr.ReadToEnd();
18             sr.Close();
19             msObj.Close();
20             Console.WriteLine(json);
21 
22 
23             //反序列化
24             string toDes = json;
25             //string to = "{\"ID\":\"1\",\"Name\":\"曹操\",\"Sex\":\"男\",\"Age\":\"1230\"}";
26             using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(toDes)))
27             {
28                 DataContractJsonSerializer deseralizer = new DataContractJsonSerializer(typeof(Student));
29                 Student model = (Student)deseralizer.ReadObject(ms);// //反序列化ReadObject
30                 Console.WriteLine("ID=" + model.ID);
31                 Console.WriteLine("Name=" + model.Name);
32                 Console.WriteLine("Age=" + model.Age);
33                 Console.WriteLine("Sex=" + model.Sex);
34             }
35             Console.ReadKey(); 
36             #endregion
複製程式碼

執行結果圖如下:

再看看使用JavaScriptJsonSerializer的情況:

JavaScriptSerializer is a class which helps to serialize and deserialize JSON. It is present in namespace System.Web.Script.Serialization which is available in assembly System.Web.Extensions.dll. To serialize a .Net object to JSON string use Serialize method. It's possible to deserialize JSON string to .Net object using Deserialize<T> or DeserializeObject methods. Let's see how to implement serialization and deserialization using JavaScriptSerializer.

這裡要先引用

1 //-----------------------------------------------------------------------------------------
2 //使用JavaScriptSerializer方式需要引入的名稱空間,這個在程式集System.Web.Extensions.dll.中
3 using System.Web.Script.Serialization;
4 //----------------------------------------------------------------------------------------
複製程式碼
 1 #region 2.JavaScriptSerializer方式實現序列化和反序列化
 2             Student stu = new Student()
 3                {
 4                    ID = 1,
 5                    Name = "關羽",
 6                    Age = 2000,
 7                    Sex = ""
 8                };
 9 
10             JavaScriptSerializer js = new JavaScriptSerializer();
11             string jsonData = js.Serialize(stu);//序列化
12             Console.WriteLine(jsonData);
13 
14 
15             ////反序列化方式一:
16             string desJson = jsonData;
17             //Student model = js.Deserialize<Student>(desJson);// //反序列化
18             //string message = string.Format("ID={0},Name={1},Age={2},Sex={3}", model.ID, model.Name, model.Age, model.Sex);
19             //Console.WriteLine(message);
20             //Console.ReadKey(); 
21 
22 
23             ////反序列化方式2
24             dynamic modelDy = js.Deserialize<dynamic>(desJson); //反序列化
25             string messageDy = string.Format("動態的反序列化,ID={0},Name={1},Age={2},Sex={3}",
26                 modelDy["ID"], modelDy["Name"], modelDy["Age"], modelDy["Sex"]);//這裡要使用索引取值,不能使用物件.屬性
27             Console.WriteLine(messageDy);
28             Console.ReadKey(); 
29             #endregion
複製程式碼

執行結果

最後看看使用JSON.NET的情況,引入類庫:

首先安裝 newtonsoft.JSON的或在Visual Studio中,工具選單->管理NuGet包管理器解決方案和型別“JSON。網”線上搜尋。如下圖:

1 //使用Json.NET類庫需要引入的名稱空間
2 //-----------------------------------------------------------------------------
3 using Newtonsoft.Json;
4 //----------------------------------------------------------------------
複製程式碼
 1 #region 3.Json.NET序列化
 2             List<Student> lstStuModel = new List<Student>() 
 3             {
 4             
 5             new Student(){ID=1,Name="張飛",Age=250,Sex=""},
 6             new Student(){ID=2,Name="潘金蓮",Age=300,Sex=""}
 7             };
 8 
 9             //Json.NET序列化
10             string jsonData = JsonConvert.SerializeObject(lstStuModel);
11 
12             Console.WriteLine(jsonData);
13             Console.ReadKey();
14 
15 
16             //Json.NET反序列化
17             string json = @"{ 'Name':'C#','Age':'3000','ID':'1','Sex':'女'}";
18             Student descJsonStu = JsonConvert.DeserializeObject<Student>(json);//反序列化
19             Console.WriteLine(string.Format("反序列化: ID={0},Name={1},Sex={2},Sex={3}", descJsonStu.ID, descJsonStu.Name, descJsonStu.Age, descJsonStu.Sex));
20             Console.ReadKey(); 
21             #endregion
複製程式碼

執行之後,結果是:

總結:最後還是儘量使用JSON.NET來序列化和反序列化,效能好。