.NET 6新特性 | System.Text.Json功能改进

在.NET 6.0中,JSON处理库得到了显著的改进,主要体现在System.Text.Json上。以下是对.NET 6.0中改进的JSON处理库的详细分析:

一、System.Text.Json的引入与优势

在.NET 6中,Microsoft引入了新的JSON库System.Text.Json作为官方推荐的序列化框架,取代了以前常用的Newtonsoft.Json(Json.NET)。System.Text.Json提供了以下优势:

  1. 性能提升:System.Text.Json使用了更少的内存开销,并且在处理大量数据时有显著的速度优势。这得益于其高效的序列化和反序列化机制,以及针对JSON处理进行的深度优化。
  2. API更简洁:System.Text.Json的API设计更为直观和简单,许多操作可以直接通过LINQ表达式完成。这使得开发者在处理JSON数据时更加便捷和高效。
  3. 兼容性强:虽然Json.NET支持的功能丰富,但大部分情况下System.Text.Json足够满足需求。同时,它能更好地与.NET的其他部分集成,提供了一致的编程体验。

二、System.Text.Json的新特性

在.NET 6中,System.Text.Json引入了多项新特性,以增强其功能和灵活性:

2.1 忽略循环引用

在.NET 6中,System.Text.Json允许在序列化时忽略循环引用,避免了因循环依赖而导致的异常。这通过JsonSerializerOptions中的ReferenceHandler.IgnoreCycles选项来实现。

using System;  
using System.Text.Json;  
using System.Text.Json.Serialization;  public class Person  
{  public string Name { get; set; }  public Person BestFriend { get; set; }  
}  public class Program  
{  public static void Main()  {  var person = new Person  {  Name = "Alice",  BestFriend = new Person  {  Name = "Bob",  BestFriend = new Person { Name = "Alice" } // 循环引用  }  };  var options = new JsonSerializerOptions  {  ReferenceHandler = ReferenceHandler.IgnoreCycles  };  string json = JsonSerializer.Serialize(person, options);  Console.WriteLine(json);  }  
}

在这个例子中,Person类有一个BestFriend属性,它指向另一个Person对象。如果BestFriend的BestFriend又指向原始对象,就会形成循环引用。通过设置JsonSerializerOptions的ReferenceHandler为IgnoreCycles,System.Text.Json会忽略这种循环引用,避免序列化时出现异常。 

2.2 序列化和反序列化的通知

System.Text.Json公开了序列化和反序列化的通知接口,如IJsonOnDeserialized、IJsonOnDeserializing、IJsonOnSerialized和IJsonOnSerializing。这使得开发者可以在序列化和反序列化过程中执行自定义逻辑。

using System;  
using System.Text.Json;  
using System.Text.Json.Serialization;  public class Person  
{  [JsonPropertyName("name")]  public string Name { get; set; }  [OnDeserialized]  public void OnDeserialized()  {  Console.WriteLine("Deserialized!");  }  [OnDeserializing]  public void OnDeserializing()  {  Console.WriteLine("Deserializing!");  }  [OnSerialized]  public void OnSerialized()  {  Console.WriteLine("Serialized!");  }  [OnSerializing]  public void OnSerializing()  {  Console.WriteLine("Serializing!");  }  
}  public class Program  
{  public static void Main()  {  var person = new Person { Name = "Alice" };  string json = JsonSerializer.Serialize(person);  Console.WriteLine(json);  Person deserializedPerson = JsonSerializer.Deserialize<Person>(json);  }  
}

在这个例子中,Person类实现了IJsonOnDeserialized、IJsonOnDeserializing、IJsonOnSerialized和IJsonOnSerializing接口中的方法。这些方法在序列化和反序列化过程中会被自动调用,允许开发者在这些过程中执行自定义逻辑。

2.3 属 性排序支持

通过JsonPropertyOrderAttribute特性,System.Text.Json允许控制属性的序列化顺序。这解决了之前序列化顺序由反射顺序决定的问题,提供了更灵活的属性排序方式。

using System;  
using System.Text.Json;  
using System.Text.Json.Serialization;  [JsonPropertyOrder(nameof(LastName), nameof(FirstName))]  
public class Person  
{  public string FirstName { get; set; }  public string LastName { get; set; }  
}  public class Program  
{  public static void Main()  {  var person = new Person { FirstName = "John", LastName = "Doe" };  string json = JsonSerializer.Serialize(person);  Console.WriteLine(json); // 输出: {"LastName":"Doe","FirstName":"John"}  }  
}

在这个例子中,Person类使用了JsonPropertyOrderAttribute来指定属性的序列化顺序。在这个例子中,LastName会在FirstName之前被序列化。 

2.4 Utf8JsonWriter的使用

System.Text.Json提供了Utf8JsonWriter类,用于高效地编写原始JSON。这使得开发者可以直接操作JSON的字节流,提高了JSON生成的效率和灵活性。

using System;  
using System.Buffers.Text;  
using System.Text.Json;  public class Program  
{  public static void Main()  {  using (var doc = new Utf8JsonWriter(new ArrayBufferWriter<byte>()))  {  doc.WriteStartObject();  doc.WriteString("name", "Alice");  doc.WriteNumber("age", 30);  doc.WriteEndObject();  string json = Encoding.UTF8.GetString(doc.Flush());  Console.WriteLine(json);  }  }  
}
2.5 对IAsyncEnumerable的支持

System.Text.Json现在支持(反)序列化JSON数组为IAsyncEnumerable<T>类型,这使得在处理大量数据时可以更加高效地利用异步编程模式。

using System;  
using System.Collections.Generic;  
using System.IO;  
using System.Linq;  
using System.Text.Json;  
using System.Threading.Tasks;  public class Program  
{  public static async Task Main()  {  async IAsyncEnumerable<int> GetNumbersAsync()  {  for (int i = 0; i < 10; i++)  {  await Task.Delay(100); // 模拟异步操作  yield return i;  }  }  using (var stream = new MemoryStream())  using (var writer = new Utf8JsonWriter(stream))  {  writer.WriteStartArray();  await foreach (var number in GetNumbersAsync())  {  writer.WriteNumberValue(number);  }  writer.WriteEndArray();  string json = Encoding.UTF8.GetString(stream.ToArray());  Console.WriteLine(json);  }  }  
}

在这个例子中,GetNumbersAsync是一个返回IAsyncEnumerable<int>的异步方法。Utf8JsonWriter被用来将异步生成的数字序列化为JSON数组。这种方式对于处理大量数据或需要异步操作的场景特别有用。

三、与Newtonsoft.Json的比较

尽管Newtonsoft.Json在过去一直是.NET生态中处理JSON的流行选择,但System.Text.Json在.NET 6中的引入提供了以下优势:

  1. 性能优势:System.Text.Json在性能和内存使用方面通常优于Newtonsoft.Json,特别是在处理大量数据时。
  2. 内置支持:System.Text.Json内置于.NET 6核心库中,不需要额外安装,降低了项目的依赖性和复杂性。
  3. 一致性:System.Text.Json与.NET的其他部分更好地集成,提供了一致的编程体验。

然而,Newtonsoft.Json仍然是一个功能丰富的JSON库,提供了许多高级特性和自定义选项。如果项目需要这些高级特性或已经在使用Newtonsoft.Json,并且没有性能或内存使用方面的问题,那么继续使用Newtonsoft.Json也是一个可行的选择。

综上所述,.NET 6.0中的System.Text.Json库在性能、API简洁性、兼容性以及新特性方面都有显著的改进。这些改进使得System.Text.Json成为处理JSON数据的强大工具,为.NET开发者提供了更高效、更便捷的JSON处理能力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/57060.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安全基线加固

安全基线加固 定义&#xff1a;为了实现基本防护需求而制定的一系列基准&#xff1b; Windows && Linux 安全基线加固 操作系统具体操作 Windows 账户认证 基本要求对应操作对登录操作系统的用户进行身份标识和鉴别 操作内容&#xff1a;检测开机登录时是否需要密码…

二叉树算法之字典树(Trie)详细解读

字典树&#xff08;Trie&#xff0c;也称前缀树或单词查找树&#xff09;是一种用于快速查找字符串的数据结构&#xff0c;主要应用于字符串集合的高效存储和查找。字典树特别适合处理具有相同前缀的大量字符串集合&#xff0c;比如单词自动补全、拼写检查等场景。 1. 字典树的…

upload-labs靶场Pass-01

upload-labs靶场Pass-01 分析 查看提示&#xff0c;提示如下 查看源码 function checkFile() {var file document.getElementsByName(upload_file)[0].value;if (file null || file "") {alert("请选择要上传的文件!");return false;}//定义允许上传…

Java-类与对象-下篇

关于类与对象&#xff0c;内容较多&#xff0c;我们分为两篇进行讲解&#xff1a; &#x1f4da; Java-类与对象-上篇&#xff1a;————<传送门:Java-类与对象-上篇-CSDN博客> &#x1f4d5; 面向对象的概念 &#x1f4d5; 类的定义格式 &#x1f4d5; 类的使用 …

ubuntu 安装nginx

sudo apt-get update sudo apt-get install nginx sudo nginx -vsudo systemctl status nginx sudo systemctl start nginx sudo systemctl stop nginx sudo systemctl restart nginx#浏览器输入&#xff1a;http://192.168.31.181/#查看文件结构 cd /etc/nginx sudo cp nginx.…

华为OD机试2024年真题(基站维修工程师)

基站维修工程师&#xff08;200分&#xff09; 小王是一名基站维护工程师&#xff0c;负责某区域的基站维护。 某地方有n个基站(1<n<10)&#xff0c;已知各基站之间的距离s(0<s<500)&#xff0c;并且基站x到基站y的距离&#xff0c;与基站y到基站x的距离并不一定会…

Java 类和对象详解(下)

个人主页&#xff1a;鲤鱼王打挺-CSDN博客 目录 &#x1f497;前言&#xff1a; &#x1f4af;一.static关键字 1. 为什么要使用static 2. static 修饰成员变量&#xff1a; 3. static 修饰成员方法&#xff1a; ​编辑 4. 静态代码块 5.静态导入包 &#x1f4af;二.…

采用分布式锁机制解决Gateway配合Redis实现统一鉴权及分布式会话共享数据不一致问题

在现代分布式系统中&#xff0c;为了实现高可用性和性能优化&#xff0c;通常会采用Gateway与Redis相结合的架构来统一鉴权&#xff0c;并实现分布式会话共享功能。然而&#xff0c;在这种架构中&#xff0c;数据不一致问题是常见的挑战之一。本文将详细探讨如何通过分布式锁机…

Wi-Fi安全性入门(基于ESP-IDF-v4.4)

主要参考资料&#xff1a; Wi-Fi 安全性: https://docs.espressif.com/projects/esp-idf/zh_CN/release-v4.4/esp32/api-guides/wifi-security.html 目录 1.ESP32 Wi-Fi 安全功能1.1 受保护的管理帧 (PMF)1.2 第三代 Wi-Fi 访问保护 (WPA3-Personal) 1.ESP32 Wi-Fi 安全功能 支…

java 第12天 单例 接口

一.设计模式之单例模式 *饿汉式/醉汉式 步骤&#xff1a; 创建私有化构造方法私有的 静态的 属于本类类型的对象公共的 静态的返回本类对象的方法 // 醉汉式/饿汉式 class Moon{// 1 私有化构造方法private Moon(){}// 2 创建一个私有的静态的属于本类类型的对象private stati…

YOLOv11改进策略【卷积层】| 替换骨干网络 CVPR-2023 FasterNet 高效快速的部分卷积块

一、本文介绍 本文记录的是基于FasterNet的YOLOv11轻量化改进方法研究。FasterNet的网络结构借鉴 CNN 的设计理念,通过提出的PConv减少推理时的计算和内存成本,同时减少通道数并增加部分比例,降低延迟,并通过后续的PWConv来弥补特征信息可能缺失的问题,提高了准确性。本文…

如何在 MySQL 中处理大量的 DELETE 操作??

全文目录&#xff1a; 开篇语前言摘要简介概述DELETE 操作的基本概念常用的 DELETE 方法 核心源码解读简单 DELETE 语句批量 DELETE 示例 案例分析案例1&#xff1a;使用简单 DELETE 删除用户数据案例2&#xff1a;使用分批 DELETE 应用场景演示场景1&#xff1a;用户管理系统场…

linux系统之jar启动脚本

编辑linux启动脚本 执行 vi run_blog 按i 进入编辑&#xff0c;复制以下代码&#xff0c;并根据当前环境修改三个参数。以下是详细完整脚本代码&#xff1a; #!/bin/bash# 配置部分 JAR_PATH"/path/to/your/app.jar" # 替换为你的 JAR 文件的实际路径 L…

Gin框架操作指南07:路由与中间件

官方文档地址&#xff08;中文&#xff09;&#xff1a;https://gin-gonic.com/zh-cn/docs/ 注&#xff1a;本教程采用工作区机制&#xff0c;所以一个项目下载了Gin框架&#xff0c;其余项目就无需重复下载&#xff0c;想了解的读者可阅读第一节&#xff1a;Gin操作指南&#…

【JVM】内存模型

文章目录 内存模型的基本概念案例 程序计数器栈Java虚拟机栈局部变量表栈帧中局部变量表的实际状态栈帧中存放的数据有哪些 操作数栈帧数据 本地方法栈 堆堆空间是如何进行管理的? 方法区静态变量存储 直接内存直接内存的作用 内存模型的基本概念 在前面的学习中,我们知道了字…

Java 8 Stream API:从基础到高级,掌握流处理的艺术

一、Stream&#xff08;流&#xff09;基本介绍 Java 8 API 添加了一个新的抽象称为Stream&#xff08;流&#xff09;&#xff0c;可以让你以一种声明的方式处理数据&#xff0c;这种风格将要处理的元素集合看做一种流&#xff0c;元素流在管道中传输&#xff0c;并在管道中间…

云黑系统全解无后门 +搭建教程

这套系统呢是玖逸之前南逸写的一套云黑系统&#xff0c;功能带有卡密生成和添加黑名单等&#xff0c;源码放在我的网盘里已经两年之久&#xff0c;由于玖逸现在已经跑路了所以现在发出来分享给大家&#xff0c;需要的可以自己拿去而开&#xff0c;反正功能也不是很多具体的自己…

电脑视频剪辑大比拼,谁更胜一筹?

随着短视频的火爆&#xff0c;越来越多的人开始尝试自己动手制作视频&#xff0c;无论是记录生活点滴还是创作个性短片&#xff0c;一款好用的视频剪辑软件是必不可少的。今天&#xff0c;我们就从短视频运营的角度&#xff0c;来聊聊几款热门的电脑视频剪辑软件&#xff0c;看…

docker配置加速器

阿里云 控制台》容器镜像服务》镜像工具》镜像加速器 复制地址&#xff1a;https://ywtoq7bz.mirror.aliyuncs.com 到&#xff1a;etc/docker下&#xff1a;vi daemon.json 格式&#xff1a; { "registry-mirrors": ["加速器地址"] } 注&#xff1…

JavaScript:闭包、防抖与节流

一&#xff0c;闭包 1&#xff0c;什么是闭包 闭包是指一个函数和其周围的词法环境(lexical environment)的组合。 换句话说&#xff0c;闭包允许一个函数访问并操作函数外部的变量。 闭包的核心特性: 函数内部可以访问外部函数的变量即使外部函数已经返回&#xff0c;内部…