添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

在这篇文章中,我们将会学到如何使用C#,来序列化对象成为Json格式的数据,以及如何反序列化Json数据到对象。

首先,解释一下json

Json【javascript对象表示方法】,它是一个轻量级的数据交换格式,我们可以很简单的来读取和写它,并且它很容易被计算机转化和生成,它是完全独立于语言的。

Json支持下面两种数据结构:

  • 键值对的集合--各种不同的编程语言,都支持这种数据结构;
  • 有序的列表类型值的集合--这其中包含数组,集合,矢量,或者序列,等等。

Json有下面几种表现形式

一个没有顺序的“键/值”,一个对象以花括号“{”开始,并以花括号"}"结束,在每一个“键”的后面,有一个冒号,并且使用逗号来分隔多个键值对。例如:

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

设置值的顺序,一个数组以中括号"["开始,并以中括号"]"结束,并且所有的值使用逗号分隔,例如:

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

3.字符串

任意数量的Unicode字符,使用引号做标记,并使用反斜杠来分隔。例如:

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;
 8 namespace JsonSerializerAndDeSerializer
10     [DataContract]
11    public class Student
12     {
13         [DataMember]
14        public int ID { get; set; }
16         [DataMember]
17        public string Name { get; set; }
19         [DataMember]
20        public int Age { get; set; }
22         [DataMember]
23        public string Sex { get; set; }
24     }

注意:上面的Student实体中的契约 [DataMember],[DataContract],是使用DataContractJsonSerializer序列化和反序列化必须要加的,对于其他两种方式不必加,也可以的。

我们程序的代码:

要先引用程序集,在引入这个命名空间

1 //----------------------------------------------------------------------------------------------
2 //使用DataContractJsonSerializer方式需要引入的命名空间,在System.Runtime.Serialization.dll.中
3 using System.Runtime.Serialization.Json;
4 //--------------------------------------------------------------------------------------------
#region 1.DataContractJsonSerializer方式序列化和反序列化
            Student stu = new Student()
                 ID = 1,
                 Name = "曹操",
                 Sex = "男",
                 Age = 1000
            //序列化
            DataContractJsonSerializer js = new DataContractJsonSerializer(typeof(Student));
            MemoryStream msObj = new MemoryStream();
            //将序列化之后的Json格式数据写入流中
            js.WriteObject(msObj, stu);
            msObj.Position = 0;
            //从0这个位置开始读取流中的数据
            StreamReader sr = new StreamReader(msObj, Encoding.UTF8);
            string json = sr.ReadToEnd();
            sr.Close();
            msObj.Close();
            Console.WriteLine(json);
            //反序列化
            string toDes = json;
            //string to = "{\"ID\":\"1\",\"Name\":\"曹操\",\"Sex\":\"男\",\"Age\":\"1230\"}";
            using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(toDes)))
                DataContractJsonSerializer deseralizer = new DataContractJsonSerializer(typeof(Student));
                Student model = (Student)deseralizer.ReadObject(ms);// //反序列化ReadObject
                Console.WriteLine("ID=" + model.ID);
                Console.WriteLine("Name=" + model.Name);
                Console.WriteLine("Age=" + model.Age);
                Console.WriteLine("Sex=" + model.Sex);
            Console.ReadKey(); 
            #endregion

运行结果图如下:

再看看使用JavaScriptJsonSerializer的情况:

JavaScriptSerializer是一个帮助序列化和反序列化JSON的类。它存在于名称空间System.Web.Script中。在组装System.Web.Extensions.dll序列化是可用。将. net对象序列化为JSON字符串使用序列化方法。使用反序列化<T>或反序列化对象方法,可以将JSON字符串反序列化为. net对象。让我们看看如何使用JavaScriptSerializer实现序列化和反序列化。

这里要先引用

1 //-----------------------------------------------------------------------------------------
2 //使用JavaScriptSerializer方式需要引入的命名空间,这个在程序集System.Web.Extensions.dll.中
3 using System.Web.Script.Serialization;
4 //----------------------------------------------------------------------------------------
#region 2.JavaScriptSerializer方式实现序列化和反序列化
            Student stu = new Student()
                   ID = 1,
                   Name = "关羽",
                   Age = 2000,
                   Sex = "男"
            JavaScriptSerializer js = new JavaScriptSerializer();
            string jsonData = js.Serialize(stu);//序列化
            Console.WriteLine(jsonData);
            反序列化方式一:
            string desJson = jsonData;
            //Student model = js.Deserialize<Student>(desJson);// //反序列化
            //string message = string.Format("ID={0},Name={1},Age={2},Sex={3}", model.ID, model.Name, model.Age, model.Sex);
            //Console.WriteLine(message);
            //Console.ReadKey(); 
            反序列化方式2
            dynamic modelDy = js.Deserialize<dynamic>(desJson); //反序列化
            string messageDy = string.Format("动态的反序列化,ID={0},Name={1},Age={2},Sex={3}",
                modelDy["ID"], modelDy["Name"], modelDy["Age"], modelDy["Sex"]);//这里要使用索引取值,不能使用对象.属性
            Console.WriteLine(messageDy);
            Console.ReadKey(); 
            #endregion

最后看看使用JSON.NET的情况,引入类库:

首先安装 newtonsoft.JSON的或在Visual Studio中,工具菜单->管理NuGet包管理器解决方案和类型“JSON。网”在线搜索。如下图:

1 //使用Json.NET类库需要引入的命名空间
2 //-----------------------------------------------------------------------------
3 using Newtonsoft.Json;
4 //----------------------------------------------------------------------
#region 3.Json.NET序列化
            List<Student> lstStuModel = new List<Student>() 
            new Student(){ID=1,Name="张飞",Age=250,Sex="男"},
            new Student(){ID=2,Name="潘金莲",Age=300,Sex="女"}
            //Json.NET序列化
            string jsonData = JsonConvert.SerializeObject(lstStuModel);
            Console.WriteLine(jsonData);
            Console.ReadKey();
            //Json.NET反序列化
            string json = @"{ 'Name':'C#','Age':'3000','ID':'1','Sex':'女'}";
            Student descJsonStu = JsonConvert.DeserializeObject<Student>(json);//反序列化
            Console.WriteLine(string.Format("反序列化: ID={0},Name={1},Sex={2},Sex={3}", descJsonStu.ID, descJsonStu.Name, descJsonStu.Age, descJsonStu.Sex));
            Console.ReadKey(); 
            #endregion

运行之后,结果是:

总结:最后还是尽量使用JSON.NET来序列化和反序列化,性能好。
C#在System.Web.Script.Serialization命名空间提供了一个JavaScriptSerializer类,该类可实现JSON序列化反序列化。但该类有个小问题,就是关于DateTime类型数据的序列化问题,先看一段代码: using System; using System.Collections.Generic; using System.Linq; using Sy...
使用C#,来序列化对象成为Json格式的数据,以及如何反序列化Json数据到对象 Json【javascript对象表示方法】,它是一个轻量级的数据交换格式,我们可以很简单的来读取和写它,并且它很容易被计算机转化和生成,它是完全独立于语言的。 Json支持下面两种数据结构: 键值对的集合--各种不同的编程语言,都支持这种数据结构; 有序的列表类型值的集合--这其包含数组,集合,矢量,...
这里可以看到是二层嵌套!!使用C#如何实现?? 思路:使用list集合实现 → 建立类 → list集合 → 微软的 Newtonsoft.Json (一款.NET开源的Json序列化反序列化) sonXMText类 using System; using System.Collections.Generic; using System.Li...