Json 序列化以及反序列化的三种方式(二)
1.什么是JSON?
Json【javascript对象表示方法】,它是一个轻量级的数据交换格式,我们可以很简单的来读取和写它,并且它很容易被计算机转化和生成,它是完全独立于语言的
2.Json支持下面两种数据结构
- 键值对的集合--各种不同的编程语言,都支持这种数据结构;
- 有序的列表类型值的集合--这其中包含数组,集合,矢量,或者序列,等等。
3.Json有下面几种表现形式
1对象
一个没有顺序的“键/值”,一个对象以花括号“{”开始,并以花括号"}"结束,在每一个“键”的后面,有一个冒号,并且使用逗号来分隔多个键值对
var user = "{'name':'Manas','gender':'Male','birthday':'1987-8-8'}";
2.数组
设置值的顺序,一个数组以中括号"["开始,并以中括号"]"结束,并且所有的值使用逗号分隔
var user_Array = "[{'user': {'name':'Manas','gender':'Male','birthday':'1987-8-8'}}, {'user':{'name':'Mohapatra','Male':'Female','birthday':'1987-7-7'}}]";
3.字符串
任意数量的Unicode字符,使用引号做标记,并使用反斜杠来分隔。
var user_String = "{\"ID\":1,\"Name\":\"Manas\",\"Address\":\"India\"}";
序列化和反序列化有三种方式:
- 使用
JavaScriptSerializer
类 - 使用
DataContractJsonSerializer
类 - 使用JSON.NET类库
我们先来看看使用 DataContractJsonSerializer的情况的引用
//---------------------------------------------------------------------------------------------- //使用DataContractJsonSerializer方式需要引入的命名空间,在System.Runtime.Serialization.dll.中 using System.Runtime.Serialization.Json; //---
再看看使用JavaScriptJsonSerializer的情况的引用
//----------------------------------------------------------------------------------------- //使用JavaScriptSerializer方式需要引入的命名空间,这个在程序集System.Web.Extensions.dll.中 using System.Web.Script.Serialization; //-------------------------------------------------------------------------
最后看看使用JSON.NET的情况,引入类库:
//使用Json.NET类库需要引入的命名空间 //----------------------------------------------------------------------------- using Newtonsoft.Json; //-------------------------------------------------------------------------
最后实战控制台代码:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Runtime.Serialization.Json; using System.IO; using System.Web.Script.Serialization; using Newtonsoft.Json; namespace Test_Control { public class Students { public int ID { get; set; } public string Name { get; set; } public int Age { get; set; } public string Sex { get; set; } } class Test2 { static void Main(string[] args) { var user = "{'name':'Manas','gender':'Male','birthday':'1987-8-8'}"; var user_Array = "[{'user': {'name':'Manas','gender':'Male','birthday':'1987-8-8'}}, {'user':{'name':'Mohapatra','Male':'Female','birthday':'1987-7-7'}}]"; var user_String = "{\"ID\":1,\"Name\":\"Manas\",\"Address\":\"India\"}"; #region 1.DataContractJsonSerializer方式序列化和反序列化 Students stu = new Students() { ID = 1, Name = "曹操", Sex = "男", Age = 1000 }; //序列化 DataContractJsonSerializer js = new DataContractJsonSerializer(typeof(Students)); 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))) { //js 反序列化为对象 JavaScriptSerializer jss = new JavaScriptSerializer(); var str_Object = jss.Deserialize<Students>(toDes); DataContractJsonSerializer deseralizer = new DataContractJsonSerializer(typeof(Students)); Students model = (Students)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(); 答案 {"Age":1000,"ID":1,"Name":"曹操","Sex":"男"} ID=1 Name=曹操 Age=1000 Sex=男 #endregion #region 2.JavaScriptSerializer方式实现序列化和反序列化 Students stu = new Students() { ID = 1, Name = "关羽", Age = 2000, Sex = "男" }; JavaScriptSerializer js = new JavaScriptSerializer(); string jsonData = js.Serialize(stu);//序列化 Console.WriteLine(jsonData); //反序列化方式一: string desJson = jsonData; Students model = js.Deserialize<Students>(desJson);// //反序列化 string message = string.Format("ID={0},Name={1},Age={2},Sex={3}", model.ID, model.Name, model.Age, model.Sex); Console.WriteLine(message); //反序列化方式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(); 答案 {"ID":1,"Name":"关羽","Age":2000,"Sex":"男"} ID=1,Name=关羽,Age=2000,Sex=男 动态的反序列化,ID=1,Name=关羽,Age=2000,Sex=男 #endregion #region 3.Json.NET序列化 List<Students> lstStuModel = new List<Students>() { new Students(){ID=1,Name="张飞",Age=250,Sex="男"}, new Students(){ID=2,Name="潘金莲",Age=300,Sex="女"} }; //Json.NET序列化 string jsonData = JsonConvert.SerializeObject(lstStuModel); Console.WriteLine(jsonData); //Json.NET反序列化 string json = @"{ 'Name':'C#','Age':'3000','ID':'1','Sex':'女'}"; Students descJsonStu = JsonConvert.DeserializeObject<Students>(json);//反序列化 Console.WriteLine(string.Format("反序列化: ID={0},Name={1},Sex={2},Sex={3}", descJsonStu.ID, descJsonStu.Name, descJsonStu.Age, descJsonStu.Sex)); Console.ReadKey(); 输出结果 [{"ID":1,"Name":"张飞","Age":250,"Sex":"男"},{"ID":2,"Name":"潘金莲","Age":300,"Sex":"女"}] 反序列化: ID=1,Name=C#,Sex=3000,Sex=女 #endregion } } }
我曾拾到过一束光,日落时还给了夕阳。