irpas技术客

C#中Json序列化和反序列化总结_行者之剑_c# json反序列化

大大的周 3899

Json序列化和反序列化总结 JSON介绍1.什么是JSON?2.JSON基于两种结构:3.几种表现形式:4.序列化和反序列化的3中方式: 1.JavaScriptSerializer类1.介绍2.示例 2.DataContractJsonSerializer类1.介绍2.示例 3.Newtonsoft.Json(JSON.NET)1.介绍2.示例

JSON介绍 1.什么是JSON?

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它使得人们很容易的进行阅读和编写。同时也方便了机器进行解析和生成。 JSON采用完全独立于程序语言的文本格式。这些特性使JSON成为理想的数据交换语言。

2.JSON基于两种结构: “名称/值”对的集合。不同的编程语言中,它被理解为对象,纪录,结构,字典,哈希表,有键列表,或者关联数组。值的有序列表。在大部分语言中,它被实现为数组,矢量,列表,序列。 3.几种表现形式:

a.对象: {“ID”:1,“Name”:“小王”,“Age”:20}。

b.数组: [ {“ID”:1,“Name”:“张三”,“CreateTime”:"/Date(1631783963711)/"},{“ID”:2,“Name”:“李四”,“CreateTime”:"/Date(1631783963713)/"},{“ID”:2,“Name”:“王五”,“CreateTime”:null} ]。

c.字符串:任意数量的Unicode字符,使用引号做标记,并使用反斜杠来分隔。例如:var userlist = “{\“ID\”:1,\“Name\”:\“Manas\”,\“Address\”:\“India]\”}” 。

JSON说完了,详见。

4.序列化和反序列化的3中方式:

1.使用JavaScriptSerializer类

2.使用DataContractJsonSerializer类

3.使用Newtonsoft.Json(JSON.NET)类库


1.JavaScriptSerializer类 1.介绍

命名空间: System.Web.Script.Serialization 程序集: System.Web.Extensions.dll

2.示例

1.添加一个控制台程序。添加程序集引用,在Program类中引入System.Web.Script.Serialization命名空间。

对于 .NET Framework 4.7.2 及更高版本,请使用命名空间中的 Api System.Text.Json 进行序列化和反序列化。 对于早期版本的 .NET Framework,请使用 Newtonsoft.Js。 此类型旨在为启用了 AJAX 的应用程序提供序列化和反序列化功能。

JavaScriptSerializer类由异步通信层在内部使用,用于序列化和反序列化浏览器与 Web 服务器之间传递的数据。

2.添加一个UserInfo类:

public class UserInfo { /// <summary> /// 编号 /// </summary> public int ID { get; set; } /// <summary> /// 名称 /// </summary> public string Name { get; set; } /// <summary> /// 创建时间 /// </summary> public DateTime? CreateTime { get; set; } public UserInfo() { } public UserInfo(int id, string name,DateTime? createTime=null) { this.ID = id; this.Name = name; this.CreateTime = createTime; } }

3.Program类代码如下:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Web.Script.Serialization; namespace SerializationDemo { class Program { static void Main(string[] args) { List<UserInfo> userList = new List<UserInfo>(); userList.Add(new UserInfo() { ID = 1, Name = "张三", CreateTime = DateTime.Now }); userList.Add(new UserInfo() { ID = 2, Name = "李四", CreateTime = DateTime.Now }); userList.Add(new UserInfo() { ID = 2, Name = "王五" }); //创建一个JavaScriptSerializer对象 JavaScriptSerializer serializer = new JavaScriptSerializer(); //将用户列表序列化成JSON string serializedResult = serializer.Serialize(userList); Console.WriteLine(serializedResult); //将JOSN反序列化成用户列表 List<UserInfo> deserializeResult = serializer.Deserialize<List<UserInfo>>(serializedResult); Console.WriteLine(deserializeResult[0].Name); Console.WriteLine(deserializeResult[0].CreateTime.Value.ToString("yyyy-MM-dd")); Console.ReadLine(); } } }

4.F5运行,结果如下:

[{“ID”:1,“Name”:“张三”,“CreateTime”:"/Date(1631788856930)/"},{“ID”:2,“Name”:“李四”,“CreateTime”:"/Date(1631788856933)/"},{“ID”:2,“Name”:“王五”,“CreateTime”:null}] 张三 2021-09-16

类详情见官网


2.DataContractJsonSerializer类 1.介绍

DataContractJsonSerializer 类别是 .NET Framework 3.5 的新成员,它可以用来将对象序列化成 JSON 格式的字串,或者执行反序列化,也就是根据 JSON 格式的字串内容来建立对象,并还原对象的状态。它在程序集 System.Runtime.Serialization.dll下的System.Runtime.Serialization.Json命名空间里。

2.示例

1.添加一个控制台程序。添加程序集引用,并引入命名空间。

2.支持自订类型和常用的 .NET 类型,包括:string、int、double、DateTime、bool 等。 为了测试至少三层的巢状序列化,写几个简单的类别,包括 Order(订单)、OrderItem(订单细项)、Product(产品),代码如下:

[DataContract] public class Order { private List<OrderItem> items; public Order() { } public Order(int id, DateTime orderDate, bool useCoupon) { this.ID = id; this.OrderDate = orderDate; this.UseCoupon = useCoupon; this.items = new List<OrderItem>(); } [DataMember] public int ID { get; set; } [DataMember] public DateTime OrderDate { get; set; } [DataMember] public bool UseCoupon { get; set; } [DataMember] public List<OrderItem> Items { get { return items; } set { items = value; } } } [DataContract] public class OrderItem { public OrderItem(Product product, int count) { this.Product = product; this.Count = count; } [DataMember] public Product Product { get; set; } [DataMember] public int Count { get; set; } } [DataContract] public class Product { public Product(string name, double price) { this.Name = name; this.Price = price; } [DataMember] public string Name { get; set; } [DataMember] public double Price { get; set; } }

要点:欲序列化的类别需套用 DataContract attribute;同时,欲序列化的类别属性还必须套用 DataMember attribute,否则该属性不会参与序列化/反序列化过程。

3.下面JSONHelper工作类使用泛型,能使你的工作轻松些:

using System; using System.IO; using System.Runtime.Serialization.Json; using System.Text; namespace DataCJS { public class JsonHelper { public static string Serialize<T>(T obj) { DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType()); using (MemoryStream ms = new MemoryStream()) { serializer.WriteObject(ms, obj); string retVal = Encoding.UTF8.GetString(ms.ToArray()); return retVal; } } public static T Deserialize<T>(string json) { T obj = Activator.CreateInstance<T>(); MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(json)); DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType()); obj = (T)serializer.ReadObject(ms); ms.Close(); ms.Dispose(); return obj; } } }

4.控制台代码:

static void Main(string[] args) { ///序列化 Order order = new Order(1, DateTime.Now, true); order.Items.Add(new OrderItem(new Product("笔记本", 3000), 2)); order.Items.Add(new OrderItem(new Product("无线键鼠", 126.9), 2)); string jsonStr = JsonHelper.Serialize<Order>(order); Console.WriteLine("\r\n序列化得到Json字符串:\r\n"); Console.WriteLine(jsonStr); ///反序列化 Order dOrder = JsonHelper.Deserialize<Order>(jsonStr); Console.WriteLine("\r\n\r\n反序列化结果:"); Console.WriteLine("\r\nOrderID: " + dOrder.ID.ToString()); Console.WriteLine("\r\nOrderDate: " + dOrder.OrderDate.ToString("yyyy/MM/dd HH:mm:ss")); Console.WriteLine("\r\nUseCoupon: " + dOrder.UseCoupon.ToString()); foreach (OrderItem item in dOrder.Items) { Console.WriteLine("\r\n=========================="); Console.WriteLine("\r\nProduct name: " + item.Product.Name); Console.WriteLine("\r\nPrice: " + item.Product.Price.ToString()); Console.WriteLine("\r\nCount: " + item.Count.ToString()); } Console.ReadLine(); }

5.运行结果如下图:

类详情见官网


3.Newtonsoft.Json(JSON.NET) 1.介绍

JSON.NET是一个开源的世界级的Json操作类库,从下面的性能对比就可以看到它的其中之一的性能优点。 齐全的API介绍,使用方式简单

2.示例

1.创建一个控制项目,在包管理器中搜索安装该包,如下图: 2.基本用法 Json.Net是支持序列化和反序列化DataTable,DataSet,Entity Framework和Entity的。下面分别举例说明序列化和反序列化。 DataTable:

static void Main(string[] args) { //序列化DataTable DataTable dt = new DataTable(); dt.Columns.Add("Age", Type.GetType("System.Int32")); dt.Columns.Add("Name", Type.GetType("System.String")); dt.Columns.Add("Sex", Type.GetType("System.String")); dt.Columns.Add("IsMarry", Type.GetType("System.Boolean")); for (int i = 0; i < 4; i++) { DataRow dr = dt.NewRow(); dr["Age"] = i + 1; dr["Name"] = "Name" + i; dr["Sex"] = i % 2 == 0 ? "男" : "女"; dr["IsMarry"] = i % 2 > 0 ? true : false; dt.Rows.Add(dr); } string dejsonstr = JsonConvert.SerializeObject(dt); Console.WriteLine("\r\n序列化得到Json字符串:\r\n"); Console.WriteLine(dejsonstr); ///反序列化 Console.WriteLine("\r\n\r\n反序列化结果:"); dt = JsonConvert.DeserializeObject<DataTable>(dejsonstr); foreach (DataRow dr in dt.Rows) { Console.WriteLine("{0}\t{1}\t{2}\t{3}\t", dr[0], dr[1], dr[2], dr[3]); } Console.ReadLine(); }

运行程序结果如下:

3.高级用法 1.忽略某些属性 2.默认值的处理 3.空值的处理 4.支持非公共成员 5.日期处理 6.自定义序列化的字段名称 7.动态决定属性是否序列化 8.枚举值的自定义格式化问题 9.自定义类型转换 10.全局序列化设置 高级用法详情参考

高级用法代码比较多这里就不贴上来了, 我的学习源代码github地址,仅供学些参考,欢迎多多交流。


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #C #json反序列化 #Json序列化和反序列化总结 #Object #Notation #是一种轻量级的数据交换格式