当前位置: 首页 > news >正文

.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处理能力。

相关文章:

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

在.NET 6.0中&#xff0c;JSON处理库得到了显著的改进&#xff0c;主要体现在System.Text.Json上。以下是对.NET 6.0中改进的JSON处理库的详细分析&#xff1a; 一、System.Text.Json的引入与优势 在.NET 6中&#xff0c;Microsoft引入了新的JSON库System.Text.Json作为官方推…...

Matlab如何对全局优化算法启动并行计算

在 MATLAB 中&#xff0c;启用并行计算可以显著提高一些优化算法&#xff08;如遗传算法 ga 和粒子群算法 particleswarm&#xff09;的速度&#xff0c;特别是在种群或粒子群较大时。要启用并行计算&#xff0c;可以使用 UseParallel 参数。 1. 启用并行计算步骤 Step 1: 检…...

MYSQL-查看数据库中的存储过程语法(六)

13.7.5.9 SHOW CREATE PROCEDURE 语句 SHOW CREATE PROCEDURE proc_name此语句是 MySQL 扩展。它返回确切的字符串 &#xff0c;可用于重新创建命名的存储过程。SHOW CREATE FUNCTION&#xff0c;显示有关存储函数的信息 &#xff08;参见第 13.7.5.8 节“ SHOW CREATE FUNCTI…...

【深度学习】(12)--模型部署 <连接客户端与服务端>

文章目录 模型部署一、模型部署的定义与目的二、模型部署的步骤三、模型部署的方式四、Flask框架五、实现模型部署1. 搭建服务端1.1 初始化Flask app1.2 加载模型1.3 数据预处理1.4 构建装饰器1.5 完整代码 2. 搭建客户端2.1 服务端网址2.2 发送请求2.3 完整代码 六、运行使用 …...

优化SQL查询的最佳实践:提升数据库性能的关键

SQL 查询是数据库操作的核心&#xff0c;特别是当数据量庞大时&#xff0c;性能问题尤为明显。优化 SQL 查询不仅能减少响应时间&#xff0c;还能提高系统整体的可伸缩性。本文将从索引、查询结构、数据库设计和缓存等方面详细介绍如何优化 SQL 查询以提升性能。 一、索引的使…...

【AIGC视频生成】视频扩散模型(综述+最新进展)

文章目录 一、综述1.1 扩散模型1.1.1 Denoising Diffusion Probabilistic Models (DDPMs)1.1.2 Score-Based Generative Models (SGMs)1.1.3 Stochastic Differential Equations (Score SDEs) 1.2 相关任务1.3 数据集1.4 评价指标 二、年度进展1.runway gen2.1 Gen-1&#xff1…...

如何下载3GPP协议?

一、进入3GPP网页 https://www.3gpp.org/ 二、点击“Specifications &Technologies” 三、点击“FTP Server” 网址&#xff1a; https://www.3gpp.org/specifications-technologies 四、找到“latest”&#xff0c;查看最新版 网址&#xff1a; https://www.3gpp.org/ftp…...

目标检测系统操作说明【用户使用指南】(python+pyside6界面+系统源码+可训练的数据集+也完成的训练模型)

1.100多种【基于YOLOv8/v10/v11的目标检测系统】目录&#xff08;pythonpyside6界面系统源码可训练的数据集也完成的训练模型&#xff09; 2.目标检测系统【环境搭建过程】&#xff08;GPU版本&#xff09; 3.目标检测系统【环境详细配置过程】&#xff08;CPU版本&#xff0…...

Vue中使用路由

目录 单页应用程序&#xff1a;SPA - Single Page Application路由 VueRouterVueRouter使用步骤组件存放目录问题 路由模块封装声明式导航 - 导航连接两个类名自定义匹配类名 声明式导航 - 跳转传参Vue路由 - 重定向Vue路由 - 404Vue路由 - 模式设置 编程式导航 - 基本跳转编程…...

【Linux】多线程安全之道:互斥、加锁技术与底层原理

目录 1.线程的互斥 1.1.进程线程间的互斥相关背景概念 1.2.互斥量mutex的基本概念 所以多线程之间为什么要有互斥&#xff1f; 为什么抢票会抢到负数&#xff0c;无法获得正确结果&#xff1f; 为什么--操作不是原子性的呢&#xff1f; 解决方式&#xff1a; 2.三种加锁…...

收藏多年的四款音频剪辑工具你pick哪一个?

在这个时代&#xff0c;音频剪辑已经成为音乐制作、播客、自媒体等领域的必备技能。而随着网络技术的飞速发展&#xff0c;我们不再需要安装庞大的软件&#xff0c;只需一个浏览器&#xff0c;就能轻松完成音频剪辑工作。今天&#xff0c;就让我为大家推荐几款优秀的在线音频剪…...

使用Redis进行在线人数统计时,有哪些性能优化技巧?

使用Redis进行在线人数统计时&#xff0c;性能优化是关键&#xff0c;以下是一些性能优化技巧&#xff1a; 选择合适的数据结构&#xff1a; 对于在线人数统计&#xff0c;可以选择使用Set数据结构&#xff0c;因为它具有自动去重和高效的集合操作特性&#xff0c;非常适合用于…...

前端模块循环依赖问题

模块循环依赖问题 在项目比较小的时候可能不怎么会遇到这个问题&#xff0c;但项目一旦有一定的体量后就可能会遇到了。 我之前做项目时就遇到这个问题&#xff0c;也是总结一篇文章。 比如这种类型的报错 commonjs存在的问题 先讲一下commonjs存在的问题。 CommonJS模块采…...

Springboot指定扫描路径

方式一&#xff1a;通过在启动类的SpringbootApplication中指定包扫描或类扫描 指定需要扫描的包 scanBasePackages{"待扫描包1","待扫描包2", . . . ," "} 指定需要扫描的类 scanBasePackageClasses{类1.class,类2.class,...} 方式二&#xff…...

【Flutter】Dart:环境搭建

Flutter 是一个基于 Dart 的跨平台开发框架&#xff0c;可以帮助我们快速构建移动应用程序。在开始 Flutter 开发之前&#xff0c;我们需要先搭建 Dart 的开发环境&#xff0c;并配置合适的编辑器&#xff0c;比如 VSCode。本教程将引导你一步步完成 Dart 和 Flutter 的环境搭建…...

OpenCV高级图形用户界面(10)创建一个新的窗口函数namedWindow()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 创建一个窗口。 函数 namedWindow 创建一个可以作为图像和跟踪条占位符的窗口。创建的窗口通过它们的名字来引用。 如果已经存在同名的窗口&am…...

水题四道。

我的 水题四道--题目目录 问题 A: 依次输出第k小整数 代码1 问题 B: 第k小整数(knumber) 代码2 树的统计 代码3 枪声问题 代码4 问题 A: 依次输出第k小整数 现有n个正整数&#xff0c;n≤10000&#xff0c;要求出这n个正整数中的第1小的整数&#xff0c;第2小的整数&#xf…...

upload-labs靶场Pass-05

upload-labs靶场Pass-05 大小写绕过 $deny_ext array(“.php”,“.php5”,“.php4”,“.php3”,“.php2”,“.html”,“.htm”,“.phtml”,“.pht”,“.pHp”,“.pHp5”,“.pHp4”,“.pHp3”,“.pHp2”,“.Html”,“.Htm”,“.pHtml”,“.jsp”,“.jspa”,“.jspx”,“.jsw”…...

【AIGC】解锁高效GPTs:ChatGPT-Builder中系统提示词Prompt的设计与应用

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;系统提示词系统提示词的作用与重要性系统提示词在构建GPTs中的作用结论 &#x1f4af;ChatGPT-Builder系统提示词的详细解读OpenAI为Builder编写的系统提示词系统提示词对…...

【JavaEE初阶】深入理解网络编程—使用UDP协议API实现回显服务器

前言 &#x1f31f;&#x1f31f;本期讲解关于TCP/UDP协议的原理理解~~~ &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 &#x1f525; 你的点赞就是小编不断更新的最大动力 &#x1f386;那么废话不…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

idea大量爆红问题解决

问题描述 在学习和工作中&#xff0c;idea是程序员不可缺少的一个工具&#xff0c;但是突然在有些时候就会出现大量爆红的问题&#xff0c;发现无法跳转&#xff0c;无论是关机重启或者是替换root都无法解决 就是如上所展示的问题&#xff0c;但是程序依然可以启动。 问题解决…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

蓝桥杯 冶炼金属

原题目链接 &#x1f527; 冶炼金属转换率推测题解 &#x1f4dc; 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V&#xff0c;是一个正整数&#xff0c;表示每 V V V 个普通金属 O O O 可以冶炼出 …...

Netty从入门到进阶(二)

二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架&#xff0c;用于…...

【JVM面试篇】高频八股汇总——类加载和类加载器

目录 1. 讲一下类加载过程&#xff1f; 2. Java创建对象的过程&#xff1f; 3. 对象的生命周期&#xff1f; 4. 类加载器有哪些&#xff1f; 5. 双亲委派模型的作用&#xff08;好处&#xff09;&#xff1f; 6. 讲一下类的加载和双亲委派原则&#xff1f; 7. 双亲委派模…...

基于PHP的连锁酒店管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...

SQL Server 触发器调用存储过程实现发送 HTTP 请求

文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...

高考志愿填报管理系统---开发介绍

高考志愿填报管理系统是一款专为教育机构、学校和教师设计的学生信息管理和志愿填报辅助平台。系统基于Django框架开发&#xff0c;采用现代化的Web技术&#xff0c;为教育工作者提供高效、安全、便捷的学生管理解决方案。 ## &#x1f4cb; 系统概述 ### &#x1f3af; 系统定…...