在這篇文章中,咱們將會學到如何使用C#,來序列化對象成爲Json格式的數據,以及如何反序列化Json數據到對象。javascript
首先,解釋一下json java
Json【javascript對象表示方法】,它是一個輕量級的數據交換格式,咱們能夠很簡單的來讀取和寫它,而且它很容易被計算機轉化和生成,它是徹底獨立於語言的。編程
Json支持下面兩種數據結構: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.字符串spa
任意數量的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來序列化和反序列化,性能好。