赞
踩
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它使得人们很容易的进行阅读和编写。同时也方便了机器进行解析和生成。 JSON采用完全独立于程序语言的文本格式。这些特性使JSON成为理想的数据交换语言。
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说完了,详见。
1.使用JavaScriptSerializer类
2.使用DataContractJsonSerializer类
3.使用Newtonsoft.Json(JSON.NET)类库
命名空间:
System.Web.Script.Serialization
程序集:
System.Web.Extensions.dll
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
DataContractJsonSerializer 类别是 .NET Framework 3.5 的新成员,它可以用来将对象序列化成 JSON 格式的字串,或者执行反序列化,也就是根据 JSON 格式的字串内容来建立对象,并还原对象的状态。它在程序集 System.Runtime.Serialization.dll下的System.Runtime.Serialization.Json命名空间里。
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.运行结果如下图:
JSON.NET是一个开源的世界级的Json操作类库,从下面的性能对比就可以看到它的其中之一的性能优点。
齐全的API介绍,使用方式简单
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地址,仅供学些参考,欢迎多多交流。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。