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

C# System.Text.Json 中 JsonConverter 使用详解

总目录


前言

在 C# 开发中,System.Text.Json 是一个高性能的 JSON 处理库,广泛用于序列化和反序列化对象。当默认的序列化行为无法满足需求时,JsonConverter 提供了强大的自定义能力。本文将详细讲解 JsonConverter 的使用方法,帮助你灵活处理复杂的 JSON 数据。


一、 JsonConverter 是什么?

1. 概述

JsonConverterSystem.Text.Json.Serialization 命名空间中的一个抽象类,它提供了将对象或值转换为 JSON 格式以及将 JSON 格式转换回对象或值的功能。System.Text.Json 提供了内置的 JsonConverter 实现,用于处理大多数基本类型,同时开发者也可以通过实现 JsonConverter<T>创建自定义的 JsonConverter 来满足特定需求。

JsonConverterSystem.Text.Json 中用于 自定义序列化和反序列化逻辑的核心类。它允许开发者完全控制 .NET 对象与 JSON 格式之间的转换过程,

2. 为什么需要 JsonConverter?

默认的序列化行为可能无法满足以下需求:

  • 特殊数据格式:日期、货币、自定义对象,如日期需格式化为 yyyy-MM-dd HH:mm:ss
  • 非标准 JSON 结构:如将嵌套对象转换为扁平化 JSON。
  • 安全处理:过滤敏感字段或转换加密数据。
  • 性能优化:避免反射或减少内存分配。

通过继承 JsonConverter<T>,开发者可以完全控制类型与 JSON 之间的转换过程。

3. JsonConverter 核心原理

JsonConverter<T> 是一个泛型类,要求实现以下两个关键方法:

  1. Read:从 Utf8JsonReader 中读取 JSON 数据并转换为 .NET 对象。
  2. Write:将 .NET 对象写入 Utf8JsonWriter 生成 JSON。

代码示例:

public class CustomConverter : JsonConverter<CustomType>
{public override CustomType Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options){// 实现反序列化逻辑}public override void Write(Utf8JsonWriter writer, CustomType value, JsonSerializerOptions options){// 实现序列化逻辑}
}

二、使用

1. 内置 JsonConverter

1)内置 JsonConverter 介绍

▶ 内置转换器

System.Text.Json 为映射到 JavaScript 基元的大多数基本类型提供了内置转换器。这些内置转换器可以处理以下基本类型:字符串、整数、浮点数、布尔值、数组和集合、字典、日期和时间(ISO 8601 格式)。

对于日期和时间类型,System.Text.Json 实现了 ISO 8601-1:2019 扩展配置文件,定义了日期和时间表示形式的组件。
详见:System.Text.Json 中的 DateTime 和 DateTimeOffset 支持。

▶ 使用内置 JsonConverter

System.Text.Json 提供的内置转换器可以处理大多数常见类型,无需额外配置即可使用。以下是一个简单的使用示例:

public class Person
{public string Name { get; set; }public int Age { get; set; }public DateTime BirthDate { get; set; }
}
class Program
{static void Main(){// 使用内置转换器序列化对象var person = new Person{Name = "John Doe",Age = 30,BirthDate = new DateTime(1990, 1, 1)};string json = JsonSerializer.Serialize(person);Console.WriteLine(json);// 输出:{"Name":"John Doe","Age":30,"BirthDate":"1990-01-01T00:00:00"}}
}

在上述示例中,System.Text.Json 使用内置转换器自动处理了 Person 对象的所有属性,包括 DateTime 类型的 BirthDate 属性,以 ISO 8601 格式进行序列化。

2)内置转换器:JsonStringEnumConverter

JsonStringEnumConverterSystem.Text.Json 中用于 将枚举(Enum)类型序列化为字符串,并支持从字符串反序列化为枚举值的内置转换器。它是 JsonConverter 的一个特化实现,专门处理枚举类型,解决了默认序列化(将枚举值转为整数)的局限性。

▶ 通过JsonSerializerOptions全局使用

定义枚举类型和相关对象:

public enum Status { Active, Inactive, Pending }
public enum CountryType { China, USA,Japan }public class Order
{public int Id { get; set; }public string Name { get; set; }public CountryType CountryType { get; set; }public Status Status { get; set; }
}

默认枚举会序列化为整数,使用 JsonStringEnumConverter 可转为字符串:

class Program
{static void Main(){// 正常序列化var order = new Order { Id = 1, Name = "Order0001", CountryType = CountryType.China, Status = Status.Pending };string json = JsonSerializer.Serialize(order);Console.WriteLine(json);// 输出:{"Id":1,"Name":"Order0001","CountryType":0,"Status":2}// 方式1var options = new JsonSerializerOptions{Converters = { new JsonStringEnumConverter() }};json = JsonSerializer.Serialize(order, options);Console.WriteLine(json);// 输出:{"Id":1,"Name":"Order0001","CountryType":"China","Status":"Pending"}// 方式2var options2 = new JsonSerializerOptions();options2.Converters.Add(new JsonStringEnumConverter());json = JsonSerializer.Serialize(order, options);Console.WriteLine(json);// 输出:{"Id":1,"Name":"Order0001","CountryType":"China","Status":"Pending"}}
}
▶ 针对特定枚举类型

如下例中通过JsonSerializerOptions中的Converters 配置只针对 Status 枚举的转换

var options = new JsonSerializerOptions
{Converters = { new JsonStringEnumConverter<Status>() }
};
json = JsonSerializer.Serialize(order, options);
Console.WriteLine(json);
// 输出:{"Id":1,"Name":"Order0001","CountryType":0,"Status":"Pending"}
▶ 通过JsonConverter 特性使用

直接在枚举类型上使用 [JsonConverter] 特性,适用于指定特定属性使用

// 第一种方式:直接在枚举上添加特性
[JsonConverter(typeof(JsonStringEnumConverter))]
public enum Status{ Active, Inactive, Pending}
public enum CountryType{China, USA,Japan}public class Order
{public int Id { get; set; }public string Name { get; set; }// 第二种方式:在对象相关属性上添加特性[JsonConverter(typeof(JsonStringEnumConverter))]public CountryType CountryType { get; set; }public Status Status { get; set; }
}
class Program
{static void Main(){// 正常序列化var order = new Order { Id = 1, Name = "Order0001", CountryType = CountryType.China, Status = Status.Pending };string json = JsonSerializer.Serialize(order);Console.WriteLine(json);// 输出:{"Id":1,"Name":"Order0001","CountryType":"China","Status":"Pending"}}
}
▶ 配置JsonStringEnumConverter 的命名策略

可通过 JsonNamingPolicy 自定义枚举值的输出格式(如 CamelCase、PascalCase 等)。

public enum Status{ Active, Inactive, Pending}
public enum CountryType{China, USA,Japan}public class Order
{public int Id { get; set; }public string Name { get; set; }   public CountryType CountryType { get; set; }public Status Status { get; set; }
}
class Program
{static void Main(){// 正常序列化var order = new Order { Id = 1, Name = "Order0001", CountryType = CountryType.China, Status = Status.Pending };var options = new JsonSerializerOptions() { Converters = { new JsonStringEnumConverter(JsonNamingPolicy.CamelCase)  }};string json = JsonSerializer.Serialize(order,options);Console.WriteLine(json);// 输出:{"Id":1,"Name":"Order0001","CountryType":"china","Status":"pending"}}
}

2. 自定义 JsonConverter

当内置转换器无法满足需求时,开发者可以创建自定义的 JsonConverter。自定义转换器需要继承 JsonConverter 类并实现两个主要方法:Read 和 Write。

下面 将通过 将日期序列化为 yyyy-MM-dd 的案例来说明如何自定义 JsonConverter

1)创建自定义转换器

创建自定义转换器类,继承 JsonConverter<T>

public class DateFormatterConverter : JsonConverter<DateTime>
{public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options){// 实现 反序列化逻辑:将Json 转化为 .NET对象}public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options){// 实现 序列化逻辑:将 .NET对象 转化为Json}
}

2)实现 ReadWrite 方法

public class DateFormatterConverter : JsonConverter<DateTime>
{public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options){return DateTime.Parse(reader.GetString()!);}public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options){writer.WriteStringValue(value.ToString("yyyy-MM-dd"));}
}

3)使用自定义JsonConverter

▶ 通过JsonSerializerOptions全局使用
public class Person
{public string Name { get; set; }public int Age { get; set; }public DateTime BirthDate { get; set; }
}class Program
{static void Main(){var person = new Person{Name = "John Doe",Age = 30,BirthDate = new DateTime(1990, 1, 1)};var options = new JsonSerializerOptions() { Converters = { new DateFormatterConverter()  }};string json = JsonSerializer.Serialize(person, options);Console.WriteLine(json);// 输出:{"Name":"John Doe","Age":30,"BirthDate":"1990-01-01"}}
}
▶ 通过JsonConverter 特性使用
public class Person
{public string Name { get; set; }public int Age { get; set; }[JsonConverter(typeof(DateFormatterConverter))]public DateTime BirthDate { get; set; }
}class Program
{static void Main(){var person = new Person{Name = "John Doe",Age = 30,BirthDate = new DateTime(1990, 1, 1)};string json = JsonSerializer.Serialize(person);Console.WriteLine(json);// 输出:{"Name":"John Doe","Age":30,"BirthDate":"1990-01-01"}}
}

三、实战案例

1. 自定义日期格式

1)创建自定义转换器类

System.Text.Json 默认使用 ISO 8601 格式序列化日期。如果需要自定义日期格式,可以创建一个处理 DateTime 的自定义转换器:

public class CustomDateTimeConverter : JsonConverter<DateTime>
{private readonly string _format;public CustomDateTimeConverter(string format){_format = format;}public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options){if (reader.TokenType == JsonTokenType.String){return DateTime.ParseExact(reader.GetString()!, _format, System.Globalization.CultureInfo.InvariantCulture);}throw new JsonException();}public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options){writer.WriteStringValue(value.ToString(_format));}
}

2)使用自定义转换器

class Program
{static void Main(){// 使用自定义日期格式var options = new JsonSerializerOptions{Converters = { new CustomDateTimeConverter("yyyy-MM-dd") }};var person = new{Name = "John Doe",Age = 30,BirthDate = new DateTime(1990, 1, 1)};string json = JsonSerializer.Serialize(person,options);Console.WriteLine(json);// 输出:{"Name":"John Doe","Age":30,"BirthDate":"1990-01-01"}var options2 = new JsonSerializerOptions();options2.Converters.Add(new CustomDateTimeConverter("yyyy-MM-dd HH:mm:ss"));json = JsonSerializer.Serialize(person,options2);Console.WriteLine(json);// 输出:{"Name":"John Doe","Age":30,"BirthDate":"1990-01-01 00:00:00"}}
}

在这个示例中,StringEnumConverter 用于将 DayOfWeek 枚举转换为字符串。Read 方法将 JSON 字符串解析为 DayOfWeek 枚举值,Write 方法将 DayOfWeek 枚举值写为 JSON 字符串。

2. 自定义枚举格式

如果需要自定义枚举的序列化行为,可以创建自己的转换器:

public class CustomEnumConverter : JsonConverter<DayOfWeek>
{public override DayOfWeek Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options){string dayString = reader.GetString();if (Enum.TryParse(dayString, out DayOfWeek day)){return day;}throw new JsonException("Invalid day of week.");}public override void Write(Utf8JsonWriter writer, DayOfWeek value, JsonSerializerOptions options){writer.WriteStringValue(value.ToString());}
}

3. 将对象转换为扁平化 JSON

需求:将嵌套对象扁平化为 JSON。

public class Address
{public string City { get; set; }public string ZipCode { get; set; }
}public class User
{public string Name { get; set; }public Address Address { get; set; }
}// 自定义转换器
public class UserConverter : JsonConverter<User>
{public override User Read(ref Utf8JsonReader reader, Type type, JsonSerializerOptions options){var user = new User();while (reader.Read()){if (reader.TokenType == JsonTokenType.EndObject)return user;if (reader.TokenType == JsonTokenType.PropertyName){var propName = reader.GetString();reader.Read();switch (propName.ToLower()){case "name":user.Name = reader.GetString();break;case "city":user.Address ??= new Address();user.Address.City = reader.GetString();break;case "zip":user.Address ??= new Address();user.Address.ZipCode = reader.GetString();break;}}}throw new JsonException("Unexpected JSON structure");}public override void Write(Utf8JsonWriter writer, User user, JsonSerializerOptions options){writer.WriteStartObject();writer.WriteString("name", user.Name);if (user.Address != null){writer.WriteString("city", user.Address.City);writer.WriteString("zip", user.Address.ZipCode);}writer.WriteEndObject();}
}

使用示例:

class Program
{static void Main(){var user = new User { Name = "Alice", Address = new Address { City = "Beijing", ZipCode = "100000" } };// 序列化string json = JsonSerializer.Serialize(user); Console.WriteLine(json);// 输出:{"Name":"Alice","Address":{"City":"Beijing","ZipCode":"100000"}}// 序列化:扁平化JSON var options = new JsonSerializerOptions { Converters = { new UserConverter() } };json = JsonSerializer.Serialize(user, options); Console.WriteLine(json);// 输出:{"name":"Alice","city":"Beijing","zip":"100000"}// 反序列化:扁平化JSON string jsonString = """{"name":"Alice","city":"Beijing","zip":"100000"}""";var user2= JsonSerializer.Deserialize<User>(jsonString,options);Console.WriteLine($"Name = {user2.Name} , City = {user2.Address.City} , ZipCode = {user2.Address.ZipCode}");// 输出:Name = Alice , City = Beijing , ZipCode = 100000}
}

4. 过滤敏感字段

需求:序列化时忽略敏感字段(如密码)。

public class User
{public string Name { get; set; }public string Password { get; set; } // 需要忽略的字段
}public class SecureUserConverter : JsonConverter<User>
{public override User Read(ref Utf8JsonReader reader, Type type, JsonSerializerOptions options){// 反序列化逻辑(略)throw new NotImplementedException();}public override void Write(Utf8JsonWriter writer, User user, JsonSerializerOptions options){writer.WriteStartObject();writer.WriteString("name", user.Name);// 跳过 Password 字段writer.WriteEndObject();}
}

📌 关于以上案例中,自定义JsonConverter 里的Read 和 Write 方法所涉及的Utf8JsonReader 与Utf8JsonWriter 对象的详细内容,可见:C# Utf8JsonReader 和 Utf8JsonWriter 使用详解

四、性能优化技巧

1. 避免反射

直接操作 Utf8JsonReaderUtf8JsonWriter,减少对象创建:

public override void Write(Utf8JsonWriter writer, MyType value, JsonSerializerOptions options)
{writer.WriteStartObject();writer.WriteString("key", value.Property); // 直接写入属性writer.WriteEndObject();
}

2. 缓存转换器实例

private static readonly DateFormatterConverter _dateConverter = new DateFormatterConverter();
var options = new JsonSerializerOptions { Converters = { _dateConverter } };

五、异常处理与调试

1. 捕获反序列化错误

public override User Read(ref Utf8JsonReader reader, Type type, JsonSerializerOptions options)
{try{// 反序列化逻辑}catch (Exception ex){throw new JsonException("Failed to parse user data", ex);}
}

2. 日志记录与调试

ReadWrite 方法中添加日志输出:

Console.WriteLine($"Serializing {value.Name} to JSON");

结语

回到目录页:C#/.NET 知识汇总
希望以上内容可以帮助到大家,如文中有不对之处,还请批评指正。


参考资料:

  • 如何在 .NET 中编写用于 JSON 序列化(封送)的自定义转换器
  • .NET 官方文档:System.Text.Json
  • JsonConverter 源码分析

相关文章:

C# System.Text.Json 中 JsonConverter 使用详解

总目录 前言 在 C# 开发中&#xff0c;System.Text.Json 是一个高性能的 JSON 处理库&#xff0c;广泛用于序列化和反序列化对象。当默认的序列化行为无法满足需求时&#xff0c;JsonConverter 提供了强大的自定义能力。本文将详细讲解 JsonConverter 的使用方法&#xff0c;帮…...

Leetcode 857 -- 贪心 | 数学

题目描述 雇佣 K 名工人的最低成本 思路 参考官方题解和这里。 代码1&#xff08;正确&#xff09; class Solution { public:double mincostToHireWorkers(vector<int>& quality, vector<int>& wage, int k) {int n wage.size();double res 0, totalq …...

基于 SpringBoot 的社区维修平台

收藏关注不迷路&#xff01;&#xff01; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff08;免费咨询指导选题&#xff09;&#xff0c;项目以及论文编写等相关问题都可以给我留言咨询&#xff0c;希望帮助更多…...

maven项目添加第三方JAR包

项目开发过程中&#xff0c;不可避免的需要用到一些maven库&#xff08;公共库、司库等&#xff09;中没有的冷门jar包依赖&#xff0c;这时&#xff0c;可以将这些第三方JAR包安装到本地maven仓库中&#xff0c;实现项目依赖的一致性。具体步骤如下&#xff1a; 1、下载jar包 …...

C#:接口(interface)

目录 接口的核心是什么&#xff1f; 1. 什么是接口&#xff08;Interface&#xff09;&#xff0c;为什么要用它&#xff1f; 2. 如何定义和使用接口&#xff1f; 3.什么是引用接口&#xff1f; 如何“引用接口”&#xff1f; “引用接口”的关键点 4. 接口与抽象类的区…...

c#和c++脚本解释器科学运算

说明&#xff1a; 我希望用c#和c写一个脚本解释器&#xff0c;用于科学运算 效果图&#xff1a; step1: c# C:\Users\wangrusheng\RiderProjects\WinFormsApp3\WinFormsApp3\Form1.cs using System; using System.Collections.Generic; using System.Data; using System.Tex…...

2025年嵌入式大厂春招高频面试真题及解析

以下是 2025 年嵌入式大厂春招高频面试真题及解析,结合真题分类和核心知识点整理: 一、‌C/C++编程基础‌ ‌1.1 指针与内存‌ ‌野指针的成因及避免方法‌(未初始化、释放后未置空)‌ malloc与calloc的区别(后者自动初始化为0)‌ ‌指针与数组的区别‌(内存分配方…...

【C++】nlohmann::json 配置加载技术实践:从基础到高级应用

一、nlohmann::json 库概况与核心特性 nlohmann::json 是 C 社区最受欢迎的 JSON 库之一&#xff0c;其设计理念简洁即美&#xff0c;通过单头文件实现完整的 JSON 解析、序列化和操作功能。 1.1 基本特性 nlohmann::json是一个现代C编写的开源JSON库&#xff0c;采用MIT协议…...

ngx_regex_init

定义在 src\core\ngx_regex.c void ngx_regex_init(void) { #if !(NGX_PCRE2)pcre_malloc ngx_regex_malloc;pcre_free ngx_regex_free; #endif } NGX_PCRE21 #if !(NGX_PCRE2) 就为假 条件不成立 ngx_regex_init 函数就成了空实现 NGX_PCRE2 被定义&#xff0c;则表示 Ngin…...

【前端扫盲】postman介绍及使用

Postman 是一款专为 API 开发与测试设计的 全流程协作工具&#xff0c;程序员可通过它高效完成接口调试、自动化测试、文档管理等工作。以下是针对程序员的核心功能介绍和应用场景说明&#xff1a; 一、核心功能亮点 接口请求构建与调试 支持所有 HTTP 方法&#xff08;GET/POS…...

Lua中os模块函数使用详解

目录 os.clock()os.date([format [, time]])os.difftime(t2, t1)os.execute(command)os.exit([code [, close]])os.getenv(varname)os.remove(filename)os.rename(oldname, newname)os.setlocale(locale [, category])os.time([table])os.tmpname()总结 以下是 Lua 中 os 模块的…...

量子计算与经典计算的拉锯战:一场关于计算未来的辩论

在计算科学领域&#xff0c;一场关于未来的激烈辩论正在上演。2025年3月&#xff0c;D-Wave量子公司的研究人员在《Science》杂志上发表了一项突破性成果&#xff0c;声称他们的量子退火处理器在几分钟内解决了一个经典超级计算机需要数百万年才能完成的复杂现实问题。这一声明…...

MySQL 基础入门

写在前面 关于MySQL的下载安装和其图形化软件Navicat的下载安装,网上已经有了很多的教程,这里就不再赘述了,本文主要是介绍了关于MySQL数据库的基础知识。 MySQL数据库 MySQL数据库基础 MySQL数据库概念 MySQL 数据库&#xff1a; 是一个关系型数据库管理系统 。 支持SQL语…...

GPT模型搭建

GPT模型搭建 1. 章节介绍 本章节聚焦于从0搭建GPT模型&#xff0c;通过事先准备的基础代码&#xff0c;引导学习者逐步构建模型。旨在让程序员、软件架构师和工程师等掌握GPT模型搭建的核心流程&#xff0c;理解其关键组件与技术细节&#xff0c;为实际应用和面试做好准备。 …...

BUUCTF-web刷题篇(8)

17.EasyCalcS 查看源码&#xff0c;发现有段代码有php文件&#xff0c;即calc.php 经过代码审计之后应该要访问calc.php文件&#xff0c;打开后&#xff1a; <?php error_reporting(0); if(!isset($_GET[num])){show_source(__FILE__); }else{$str $_GET[num];$blackli…...

AI SEO内容优化指南:如何打造AI平台青睐的高质量内容

AI SEO内容优化指南&#xff1a;如何打造AI平台青睐的高质量内容 在生成式AI平台&#xff08;如DeepSeek、Kimi、豆包、腾讯元宝等&#xff09;主导的搜索新时代&#xff0c;内容优化已成为企业抢占流量入口的核心策略。本文将从内容创作、分发到效果维护全链路&#xff0c;解…...

无需预对齐即可消除批次效应,东京大学团队开发深度学习框架STAIG,揭示肿瘤微环境中的详细基因信息

生物组织是由多种类型细胞构成的复杂网络&#xff0c;这些细胞通过特定的空间配置执行重要功能。近年来&#xff0c;10x Visium、Slide-seq、Stereo-seq 和 STARmap 等空间转录组学 (ST) 技术的进步&#xff0c;使得生物学家们能够在空间结构内绘制基因数据&#xff0c;从而各类…...

B2B2C多用户商城系统:打造新零售电商生态的创新解决方案

在当今数字化时代&#xff0c;电商行业正以前所未有的速度蓬勃发展&#xff0c;而新零售作为电商与传统零售的深度融合&#xff0c;正逐渐成为市场的新宠。为了满足这一变革带来的多元化需求&#xff0c;B2B2C多用户商城系统应运而生&#xff0c;为商家和消费者搭建了一个高效、…...

走向多模态AI之路(二):多模态 AI 如何工作?

目录 前言一、跨模态对齐&#xff08;Cross-modal Alignment&#xff09;&#xff1a;AI 如何理解不同模态的关系二、多模态融合&#xff08;Multimodal Fusion&#xff09;&#xff1a;AI 如何整合不同模态的信息三、多模态生成&#xff08;Multimodal Generation&#xff09;…...

MCP 实战:实现server端,并在cline调用

本文动手实现一个简单的MCP服务端的编写&#xff0c;并通过MCP Server 实现成绩查询的调用。 一、配置环境 安装mcp和uv, mcp要求python版本 Python >3.10; pip install mcppip install uv 二、编写并启用服务端 # get_score.py from mcp.server.fastmcp import…...

C#游戏开发【第18天】 | 深入理解队列(Queue)与栈(Stack):从基础到任务队列实战

Langchain系列文章目录 01-玩转LangChain&#xff1a;从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块&#xff1a;四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain&#xff1a;从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…...

2.5路径问题专题:LeetCode 64. 最小路径和

动态规划解决最小路径和问题 1. 题目链接 LeetCode 64. 最小路径和 2. 题目描述 给定一个包含非负整数的 m x n 网格 grid&#xff0c;从网格的左上角出发&#xff0c;每次只能向右或向下移动一步&#xff0c;最终到达右下角。要求找到一条路径&#xff0c;使得路径上的数字…...

办公设备管理系统(springboot+ssm+jsp+maven)

基于springboot的办公设备管理系统(springbootssmjspmaven) 系统功能主要有&#xff1a; 欢迎页账号管理 管理员账号管理系统账号添加密码修改 普通管理员管理 用户管理用户添加用户查询 资产类型管理资产信息管理资产档案管理资产报表...

蓝桥杯2024JavaB组的一道真题的解析

文章目录 1.问题描述2.问题描述3.思路分析4.代码分析 1.问题描述 这个是我很久之前写的一个题目&#xff0c;当时研究了这个题目好久&#xff0c;发布了一篇题解&#xff0c;后来很多人点赞&#xff0c;我都没有意识到这个问题的严重性&#xff0c;我甚至都在怀疑自己&#xf…...

数据库--SQL

SQL&#xff1a;Structured Query Language&#xff0c;结构化查询语言 SQL是用于管理关系型数据库并对其中的数据进行一系列操作&#xff08;包括数据插入、查询、修改删除&#xff09;的一种语言 分类&#xff1a;数据定义语言DDL、数据操纵语言DML、数据控制语言DCL、事务处…...

SQL Server:Log Shipping 说明

目录标题 SQL Server Log Shipping与Oracle归档日志备份对比分析一、SQL Server Log Shipping的日志截断机制二、Oracle归档日志备份对比三、关键配置对比表四、最佳实践建议 如何修改和查看SQL Server默认备份配置防止自动删除&#xff1f;一、查看现有备份配置二、修改备份配…...

Zephyr实时操作系统初步介绍

一、概述 Zephyr是由Linux基金会托管的开源实时操作系统&#xff08;RTOS&#xff09;&#xff0c;专为资源受限的物联网设备设计。其核心特性包括模块化架构、跨平台兼容性、安全性优先以及丰富的连接协议支持。基于Apache 2.0协议&#xff0c;Zephyr允许商业和非商业用途的自…...

【大模型系列篇】大模型基建工程:基于 FastAPI 自动构建 SSE MCP 服务器 —— 进阶篇

&#x1f525;&#x1f525;&#x1f525; 上期 《大模型基建工程&#xff1a;基于 FastAPI 自动构建 SSE MCP 服务器》中我们使用fastapi-mcp自动挂载fastapi到mcp工具&#xff0c;通过源码分析和实践&#xff0c;我们发现每次sse请求又转到了内部fastapi RESTful api接口&…...

深度学习deeplearn3

# Jupyter Notebook魔法命令&#xff0c;用于在Notebook中内联显示图表 %matplotlib inline# 导入NumPy库&#xff0c;用于高效的数值计算 import numpy as np# 从matplotlib_inline库导入backend_inline模块&#xff0c;用于设置图表显示格式 from matplotlib_inline import b…...

(九)图形管线

一图说明问题 顶点数据->顶点着色器->细分着色器->几何着色器->光栅化->片元着色器->颜色混合 创建图形管线函数放在后面位置 void MyApplication::initVulkan() { createInstance(); createSurface(); pickPhysicalDevice(); createLogicalDevice(); cre…...

7-3 逆序的三位数

程序每次读入一个正3位数&#xff0c;然后输出按位逆序的数字。注意&#xff1a;当输入的数字含有结尾的0时&#xff0c;输出不应带有前导的0。比如输入700&#xff0c;输出应该是7。 输入格式&#xff1a; 每个测试是一个3位的正整数。 输出格式&#xff1a; 输出按位逆序…...

git从历史版本创建新分支或标签

git从某个历史版本创建标签 # 查看历史版本 git log git tag tag-v1.0 780e2a7fc714faf388ba71git从某个分支的指定历史版本中创建新分支 # 查看历史版本 git log # 从历史分支创建标签 git checkout -b new-branch 780e2a7fc714faf388ba71...

HTML 音频(Audio)学习笔记

一、HTML 音频概述 在 HTML 中&#xff0c;音频可以通过多种方式播放&#xff0c;但要确保音频在不同浏览器和设备上都能正常播放&#xff0c;需要掌握一些技巧。HTML5 引入了 <audio> 元素&#xff0c;为音频播放提供了一种标准方法&#xff0c;但在 HTML4 中&#xff…...

五种音频器件综合对比——《器件手册--音频器件》

目录 音频器件 简述 1. 扬声器&#xff08;Speakers&#xff09; 2. 麦克风&#xff08;Microphones&#xff09; 3. 放大器&#xff08;Amplifiers&#xff09; 4. 音频接口&#xff08;Audio Interfaces&#xff09; 5. 音频处理器&#xff08;Audio Processors&#xff09…...

数据结构复习(单调栈,单调队列,KMP,manacher,tire,字符串哈希)

单调栈&#xff1a; 介绍&#xff1a; 单调栈用于解决"寻找每个元素左侧/右侧第一个比它小/大的元素"类问题。栈中元素保持单调性&#xff0c;时间复杂度O(n)。 维护一个严格递增栈。对于每个元素a[i]&#xff0c;不断弹出栈顶比a[i]大的元素&#xff0c;剩下的栈顶即…...

(学习总结32)Linux 基础 IO

Linux 基础 IO 一、什么是 " 文件 "二、C 文件接口打开文件写文件读文件其它介绍 三、系统文件 I/O传递标志位系统接口写文件系统接口读文件部分系统调用接口介绍打开文件函数 open关闭文件函数 close写入文件函数 write读取文件函数 read 文件描述符 fdfd 0 & 1…...

操作系统(一):概念及主流系统全分析

目录 一.操作系统是什么 二.操作系统的分类 2.1 按应用场景分类 2.2 按实时性分类 2.3 按内核架构分类 2.4 按用户与任务分类 三.主流操作系统比较 四.未来趋势 一.操作系统是什么 操作系统&#xff08;Operating System, OS&#xff09;是计算机系统的核心软件&#x…...

三、GPIO

一、GPIO简介 GPIO&#xff08;General Purpose Input Output&#xff09;通用输入输出口GPIO引脚电平&#xff1a;0V&#xff08;低电平&#xff09;~3.3V&#xff08;高电平&#xff09;&#xff0c;部分引脚可容忍5V 容忍5V&#xff0c;即部分引脚输入5V的电压&#xff0c;…...

Ceph异地数据同步之-RBD异地同步复制(上)

#作者&#xff1a;闫乾苓 文章目录 前言基于快照的模式&#xff08;Snapshot-based Mode&#xff09;工作原理单向同步配置步骤单向同步复制测试双向同步配置步骤双向同步复制测试 前言 Ceph的RBD&#xff08;RADOS Block Device&#xff09;支持在两个Ceph集群之间进行异步镜…...

fastapi完全离线环境(无外网)的访问Swagger所做特殊处理

在互联网环境中&#xff0c;只要 启动FastAPI 服务运行在本地机器上&#xff0c;访问 http://localhost:8000/docs&#xff08;Swagger UI&#xff09;就可以访问到Swagger界面&#xff0c;但是在完全离线环境&#xff08;无外网&#xff09;下如何访问Swagger页面呢&#xff1…...

在网络中加入预训练的多层感知机(MLP)有什么作用?

在网络中加入预训练的多层感知机&#xff08;MLP&#xff09;通常是为了引入先验知识、提升特征表示能力或dropout&#xff0c;具体作用取决于MLP的设计和预训练任务。以下是常见的应用场景和优势&#xff1a; 1. 特征融合与迁移学习:预训练的MLP可以作为特征提取器&#xff0…...

3.2/Q2,GBD数据库最新文章解读

文章题目&#xff1a;Temporal trends in the burden of vertebral fractures caused by falls in China and globally from 1990 to 2021: a systematic analysis of the Global Burden of Disease Study 2021 DOI&#xff1a;10.1186/s13690-025-01500-y 中文标题&#xff1a…...

机器学习的一百个概念(9)学习曲线

前言 本文隶属于专栏《机器学习的一百个概念》&#xff0c;该专栏为笔者原创&#xff0c;引用请注明来源&#xff0c;不足和错误之处请在评论区帮忙指出&#xff0c;谢谢&#xff01; 本专栏目录结构和参考文献请见[《机器学习的一百个概念》 ima 知识库 知识库广场搜索&…...

浅谈Tomcat数据源连接池

目录 为什么需要JDBC连接池 Tomcat JDBC Pool 相关参数 1. 基本配置 2. 连接池大小控制 3. 连接验证与测试 4. 空闲连接回收 5. 连接泄漏与超时 Tomcat JDBC Pool 源码分析&#xff08;tomcat 8.5.3&#xff09; DataSourceFactory DataSource ConnectionPool Pool…...

Techub 财报解读:Circle 冲刺 IPO,但收入增长难掩利润困局

作者&#xff1a;Techub 财报解读 撰文&#xff1a;Yangz&#xff0c;Techub News 4 月 1 日&#xff0c;Circle 向美国证券交易委员会&#xff08;SEC&#xff09;提交 S-1 文件&#xff0c;计划进行首次公开募股&#xff08;IPO&#xff09;&#xff0c;股票代码为 CRCL&…...

C++中的链表操作

在C中&#xff0c;链表是一种常见的数据结构&#xff0c;它由一系列节点组成&#xff0c;每个节点包含数据部分和指向下一个节点的指针。C标准库&#xff08;STL&#xff09;中提供了std::list和std::forward_list两种链表实现&#xff0c;分别对应双向链表和单向链表。此外&am…...

Vue2 生命周期

文章目录 前言&#x1f504; Vue2 生命周期流程&#xff08;8个核心钩子&#xff09;&#x1f4dd; 代码中典型用法示例一、您的描述验证二、完整生命周期代码示例三、关键阶段行为说明&#x1f50d; 常见问题 前言 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案…...

2007-2022年 上市公司政府补助数据 -社科数据

上市公司政府补助数据&#xff08;2007-2022年&#xff09;-社科数据https://download.csdn.net/download/paofuluolijiang/90028547 https://download.csdn.net/download/paofuluolijiang/90028547 政府补助是指政府为支持企业发展&#xff0c;提供的资金或资源支持。对于上市…...

设计心得——状态机

一、状态机 在设计一些与硬件交互或者游戏等开发中&#xff0c;经常会听到状态机&#xff08;State Machines&#xff09;这个字眼&#xff0c;而在设计模式&#xff08;GoF&#xff09;中&#xff0c;又经常听到状态模式这个概念&#xff0c;它们之间有什么联系和不同呢&…...

python match case语法

学习路线&#xff1a;B站 普通的if判断 def if_traffic_light(color):if color red:return Stopelif color yellow:return Slow downelif color green:return Goelse:return Invalid colorprint(if_traffic_light(red)) # Output: Stop print(if_traffic_light(yellow)) …...