一、JSON定义
JSON (JavaScript Object Notation) 是一种基于文本,独立于语言的轻量级数据交换格式,它易于阅读和编写,并且易于机器解析和生成。现已成为各种应用程序之间数据交换和通信的主流数据格式。
二、JSON数据结构
JSON有两种数据结构,分别为键值对(被理解为对象、结构等)的集合与值的有序列表(被理解为数组)。
JSON 的最小单元为键值对,即Key-Value组合。它的数据结构需要满足以下条件:
-
键值对组成,每个键(属性名)都是一个字符串,后面跟着一个值。
-
值可以是字符串、数字(整数和浮点数)、布尔值true或false、对象、数组、null(空值缺失的值)等。
-
对象是由一对大括号{}包围的键值对集合,键和值之间用冒号:分隔。
-
数组是由一对方括号[]包围的值的有序列表,值之间用逗号,分隔。
一个常规JSON示例如下:
{ "name": "dotNet开发技术分享", "quantity": 30, "city": shenzhen, "isRead": true, "content": ["知识", "案例","工具"] }
JSON对象可以嵌套在其他JSON对象中,形成复杂的数据结构。数组也可以包含其他JSON值,包括对象和数组。我们来看一个示例:
{ "name": "dotNet开发技术分享", "quantity": 23, "isRead": true, "content": ["知识", "案例","工具"], "article": [{ "name": ".NET 发展历程与未来", "url": "https://mp.weixin.qq.com/s/7i_jev-UlYfdV6Gfs9ONrg" }, { "name": ".NET 如何实现与串口设备通信", "url": "https://mp.weixin.qq.com/s/OpV0dKlZ2pX-8Wl8MqwkQA" }] }
三、JSON缺点
-
不支持注释: 这可能使得编写和维护复杂数据时变得有些困难。
-
无法表示二进制数据:这意味着它无法用于存储和传输图像、视频等二进制数据。
-
不支持命名空间:这可能会导致不同的应用程序之间发生命名冲突。
-
不支持DTD:这使得在验证 JSON 数据格式时不太方便。
四、JSON 注意事项
-
字符串必须使用双引号" ",而不能使用单引号' '。
-
键必须是字符串,必须使用双引号" "。
-
格式必须严格遵守规定,否则可能会导致解析错误。
五、.NET使用JSON
在这主要讲解C#语言中,我们是如何生成与解析JSON数据,在C#中有几个常用的JSON解析库,它们分别是System.Text.Json、Newtonsoft.Json、JavaScriptSerializer、DataContractJsonSerializer。
-
Newtonsoft.Json
1.1、是C#中最常用的JSON解析库,广泛用于处理JSON数据。
1.2、它提供了丰富的功能,包括对象序列化、反序列化、LINQ查询、处理嵌套对象和数组、自定义序列化、自定义命名策略等等。
1.3、它支持.NET框架和.NET Core,并且在开发社区中有广泛的支持和文档。
-
System.Text.Json
2.1、是.NET Core 3.0及更高版本中引入的官方JSON库。它提供了基本的2.2、JSON序列化和反序列化功能,是.NET Core的一部分,无需额外安装。2.3、由于是官方支持的库,因此在.NET Core应用中使用时,它具有性能和可移植性方面的优势。
-
DataContractJsonSerializer
3.1、是.NET Framwork3.5自带的System.Runtime.Serialization.Json。
3.2、它提供了基本的JSON序列化和反序列化功能。
3.3、需要添加引用System.ServiceModel.Web 和 System.Runtime.Serialization。
-
JavaScriptSerializer
4.1、需要添加引用System.Web.Extensions.dll,该类位于
4.2、System.Web.Script.Serialization命名空间下。
六、案例
案例主要介绍Newtonsoft.Json
的使用以及操作,我们可以通过指令在visual studio中安装或者通过NuGet包管理器来安装,也可去官网下在Newtonsoft.Json.dll文件后引用到项目中。这需根据项目使用.NET 版本情况而定。这里主要从序列化和反序列化来举例:
-
序列化
序列化是将我们代码中的对象转换为JSON字符串数据格式。下面看一段代码:
using Newtonsoft.Json; using System; namespace JsonExample { class Program { static void Main(string[] args) { try { // 创建执行结果对象 RequestResult pequestResult = new RequestResult { Cmd = "Print", RequestID = "ID20240111210000001", Status = true, Message=string.Empty }; // 将对象序列化为JSON字符串 string pequestResultJson = JsonConvert.SerializeObject(pequestResult); } catch (Exception ex) { } } } /// <summary> /// 请求执行结果 /// </summary> [DataContract(Namespace = "")] public class RequestResult { /// <summary> /// 指令 /// </summary> [DataMember(Order = 0)] public string Cmd { get; set; } /// <summary> /// 请求ID /// </summary> [DataMember(Order = 1)] public string RequestID { get; set; } /// <summary> /// 状态 /// </summary> [DataMember(Order = 2)] public bool Status { get; set; } /// <summary> /// 信息 /// </summary> [DataMember(Order = 3)] public string Message { get; set; } } }
-
反序列化
反序列化是将JSON字符串数据格式转换为代码对象。 下面看一段代码:
using Newtonsoft.Json; using System; namespace JsonExample { class Program { static void Main(string[] args) { try { // JSON字符串示例 string jsonContent = "{\"Cmd\":\"Print\",\"RequestID\":\"ID20240111210000002\",\"Status\":false,\"Message\":\"\"}"; // 将JSON字符串反序列化为C#对象 RequestResult pequestResult = JsonConvert.DeserializeObject<RequestResult>(jsonContent); } catch (Exception ex) { } } } /// <summary> /// 请求执行结果 /// </summary> [DataContract(Namespace = "")] public class RequestResult { /// <summary> /// 指令 /// </summary> [DataMember(Order = 0)] public string Cmd { get; set; } /// <summary> /// 请求ID /// </summary> [DataMember(Order = 1)] public string RequestID { get; set; } /// <summary> /// 状态 /// </summary> [DataMember(Order = 2)] public bool Status { get; set; } /// <summary> /// 信息 /// </summary> [DataMember(Order = 3)] public string Message { get; set; } } }
七、总结
本文先介绍什么JSON以及数据格式、缺点,然后通过一个案例了解在.NET中通过类库简单的JSON使用。希望大家通过本文有所收获。后续还会对.NET 如何使用或者针对相关类库深入介绍。
获取更多C#知识可关注【dotNet开发技术分享】公众号