在C#中,Json的序列化和反序列化的⼏种⽅式总结
在这篇⽂章中,我们将会学到如何使⽤C#,来序列化对象成为Json格式的数据,以及如何反序列化Json数据到对象。
⾸先,解释⼀下json
Json【javascript对象表⽰⽅法】,它是⼀个轻量级的数据交换格式,我们可以很简单的来读取和写它,并且它很容易被计算机转化和⽣成,它是完全独⽴于语⾔的。
Json⽀持下⾯两种数据结构:
键值对的集合--各种不同的编程语⾔,都⽀持这种数据结构;
有序的列表类型值的集合--这其中包含数组,集合,⽮量,或者序列,等等。
Json有下⾯⼏种表现形式
1.对象
⼀个没有顺序的“键/值”,⼀个对象以花括号“{”开始,并以花括号"}"结束,在每⼀个“键”的后⾯,有⼀个冒号,
并且使⽤逗号来分隔多个键值对。例如:
1var user = {"name":"Manas","gender":"Male","birthday":"1987-8-8"}
2.数组
设置值的顺序,⼀个数组以中括号"["开始,并以中括号"]"结束,并且所有的值使⽤逗号分隔,例如:
1var userlist = [{"user":{"name":"Manas","gender":"Male","birthday":"1987-8-8"}},
2 {"user":{"name":"Mohapatra","Male":"Female","birthday":"1987-7-7"}}]
3.字符串
任意数量的Unicode字符,使⽤引号做标记,并使⽤反斜杠来分隔。例如:
1var 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
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using System.Threading.Tasks;
6using System.Runtime.Serialization;
7
8namespace JsonSerializerAndDeSerializer
9 {
10    [DataContract]
11public class Student
12    {
13        [DataMember]
14public int ID { get; set; }
15
16        [DataMember]
17public string Name { get; set; }
18
19        [DataMember]
20public int Age { get; set; }
21
22        [DataMember]
23public string Sex { get; set; }
24    }
25 }
注意:上⾯的Student实体中的契约 [DataMember],[DataContract],是使⽤DataContractJsonSerializer序列化和反序列化必须要加的,对于其他两种⽅式不必加,也可以的。
我们程序的代码:
要先引⽤程序集,在引⼊这个命名空间
1//----------------------------------------------------------------------------------------------
2//使⽤DataContractJsonSerializer⽅式需要引⼊的命名空间,在System.Runtime.Serialization.dll.中
3using 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);
17string json = sr.ReadToEnd();
18            sr.Close();
19            msObj.Close();
20            Console.WriteLine(json);
21
22
23//反序列化
24string toDes = json;
25//string to = "{\"ID\":\"1\",\"Name\":\"曹操\",\"Sex\":\"男\",\"Age\":\"1230\"}";
26using (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.dl
l. 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.中
3using 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();
js逗号分割的字符串转数组11string jsonData = js.Serialize(stu);//序列化
12            Console.WriteLine(jsonData);
13
14
15////反序列化⽅式⼀:
16string 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
24dynamic modelDy = js.Deserialize<dynamic>(desJson); //反序列化
25string 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//-----------------------------------------------------------------------------
3using Newtonsoft.Json;
4//----------------------------------------------------------------------
1#region 3.Json.NET序列化
2            List<Student> lstStuModel = new List<Student>()
3            {
4
5new Student(){ID=1,Name="张飞",Age=250,Sex="男"},
6new Student(){ID=2,Name="潘⾦莲",Age=300,Sex="⼥"}
7            };
8
9//Json.NET序列化
10string jsonData = JsonConvert.SerializeObject(lstStuModel);
11
12            Console.WriteLine(jsonData);
13            Console.ReadKey();
14
15
16//Json.NET反序列化
17string 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来序列化和反序列化,性能好。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。