我们在使用 Entity Framework Core(EF Core) 时,如果希望 全局设置 JSON 序列化和反序列化使用 UTF-8 编码,通常需要配置 System.Text.Json 的默认行为,因为 EF Core 6.0 及以上版本默认使用 System.Text.Json 进行 JSON 操作。


✅ 场景说明

EF Core 中涉及 JSON 序列化的常见场景包括:

  • 使用 HasConversion() 将复杂类型(如 Dictionary, List<T> 等)映射到数据库字段;
  • 使用 FromSqlRaw()ExecuteSqlRaw() 执行返回 JSONSQL 查询;
  • 使用 ValueConverter 对自定义对象进行 JSON 转换;
  • ASP.NET Core 中与 System.Text.Json 配合使用处理 API 请求/响应。

🧰 如何全局设置 UTF-8?

方法一:配置 EF Core 的 ValueConverter 使用 UTF-8

如果你是通过 HasConversion() 来转换实体属性为 JSON 字符串,可以显式指定使用 UTF-8

modelBuilder.Entity<MyEntity>().Property(e => e.MyJsonField).HasConversion(v => JsonSerializer.Serialize(v, new JsonSerializerOptions { WriteIndented = false, Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping }),v => JsonSerializer.Deserialize<MyType>(v, new JsonSerializerOptions { PropertyNameCaseInsensitive = true })!);

💡 注意:JavaScriptEncoder.UnsafeRelaxedJsonEscaping 可选,用于支持非 ASCII 字符的直接输出。


方法二:全局注册 UTF-8 作为默认编码(适用于 ASP.NET Core)

如果你使用的是 ASP.NET Core,并且希望整个应用中所有 JSON 操作都使用 UTF-8,可以在 Program.csStartup.cs 中配置:

.NET 6/7/8/9 示例(Program.cs):
var builder = WebApplication.CreateBuilder(args);// 全局配置 System.Text.Json 使用 UTF-8
builder.Services.Configure<JsonOptions>(options =>
{options.JsonSerializerOptions.WriteIndented = false;options.JsonSerializerOptions.Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping; // 支持中文等字符options.JsonSerializerOptions.PropertyNameCaseInsensitive = true;
});

这样 EF Core 在调用 ToJson()FromBodyToString() 等方法时也会使用此配置。


方法三:自定义 JsonValueConverterSelector(高级用法)

你可以创建一个继承自 JsonValueConverterSelector 的类,并重写其行为以全局控制 JSON 序列化选项。

public class Utf8JsonValueConverterSelector : JsonValueConverterSelector
{private readonly JsonSerializerOptions _options = new(){WriteIndented = false,Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping};public override ValueConverter? Select(Type modelClrType, Type providerClrType, DbContext context){if (providerClrType == typeof(string)){return new GenericJsonConverter(modelClrType, _options);}return base.Select(modelClrType, providerClrType, context);}
}

然后在 OnConfiguring 中注册它:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{optionsBuilder.ReplaceService<IValueConverterSelector, Utf8JsonValueConverterSelector>();
}

📌 总结

方法适用范围是否推荐
显式配置 HasConversion()单个字段✅ 推荐
配置 JsonOptions 全局ASP.NET Core + EF Core API 层✅ 推荐
自定义 JsonValueConverterSelector全局自动处理 JSON 字段🔧 高级用法

🧪 示例:完整实体配置

public class MyEntity
{public int Id { get; set; }public Dictionary<string, object> Data { get; set; } = null!;
}// 配置:
modelBuilder.Entity<MyEntity>().Property(e => e.Data).HasConversion(v => JsonSerializer.Serialize(v, new JsonSerializerOptions { Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping }),v => JsonSerializer.Deserialize<Dictionary<string, object>>(v)!);

这样可以确保存储和读取 JSON 数据时始终使用 UTF-8 编码,避免乱码或无法解析的问题。

如需进一步结合数据库字段类型(如 PostgreSQLjson/jsonbSQL Servernvarchar(max)),也可以配合数据库函数优化。

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

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

相关文章

WPF CommunityToolkit.Mvvm 信使 (ObservableRecipient)

WPF CommunityToolkit.Mvvm 中的 ObservableRecipient 是什么&#xff1f; ObservableRecipient 是 .NET Community Toolkit MVVM 库中的一个核心类&#xff0c;继承自 ObservableObject。它专为 WPF 应用设计&#xff0c;提供以下核心功能&#xff1a; 基础数据绑定支持&am…

《C++》命名空间简述

文章目录 一、命名空间定义二、访问命名空间内的成员三、标准命名空间:std四、嵌套命名空间 一、命名空间定义 在C中&#xff0c;命名空间&#xff08;namespace)是一种将标识符分组的机制&#xff0c;用于避免重命名。例如&#xff1a; int a 3;int main() {int a 0;print…

【路径规划】基于Matlab的改进RRT算法二维/三维路径规划

基于Matlab的改进RRT算法二维/三维路径规划 一、引言 在机器人学、自动驾驶等领域&#xff0c;路径规划是一个关键问题&#xff0c;它旨在为机器人或车辆找到一条从起始点到目标点的安全、高效的路径。RRT&#xff08;Rapidly-exploring Random Trees&#xff09;算法作为一种…

PHP的命名空间与自动加载机制

在PHP 5.3版本之后&#xff0c;引入了命名空间的概念&#xff0c;这为解决全局命名冲突和促进代码的模块化提供了强有力的工具。命名空间允许开发者将类、函数和常量封装在不同的命名空间中&#xff0c;从而避免了全局范围内的名称冲突问题。 命名空间基础 命名空间在PHP中是…

OpenSIPS 邂逅 Kafka:构建高效 VoIP 消息处理架构

使用场景使用步骤 引入模块组装&发送数据消费数据故障转移 使用场景 异步日志处理&#xff1a;将 OpenSIPS 中的 SIP 信令日志、通话记录&#xff08;CDR&#xff09;等数据发送到 Kafka 队列中。 事件通知与监控&#xff1a;利用 OpenSIPS 的 event_interface 模块将 S…

《AI大模型应用技术开发工程师》学习总结

以下是对你提供的《AI大模型应用技术开发工程师》课程内容的系统梳理&#xff0c;已去除所有广告、价格、报名、个人信息等内容&#xff0c;并补全了技术要点&#xff0c;最后给出客观的学习建议和个人感想&#xff0c;适合公开分享或自我学习参考。 AI大模型应用技术开发工程师…

Python爬虫实战:研究LOSO相关技术

1. 引言 1.1 研究背景与意义 随着互联网数据的爆炸式增长,个性化推荐系统成为提升用户体验的关键技术。准确捕捉用户兴趣需要大量多维度数据,但获取高质量标注数据面临隐私保护、数据分散等挑战。网络爬虫技术为自动采集用户行为数据提供了解决方案,而如何有效评估模型在个…

stm32万年历仿真+keil5程序

stm32万年历 本设计是利用单片机实现一个简易万年历系统&#xff0c;能够准确显示时、分、秒信息。用户可通过特定按键对时间进行设置调整&#xff0c;具备基本的时间校准功能&#xff0c;可满足日常简易计时需求。运用了stm32单片机模块内部定时器 / 计数器功能来实现精确计时…

操作系统--名称解释

第一章: 操作系统:位于硬件层之上,所有软件层之下的一个系统软件,是管理系统中各种软硬件资源,方便用户使用计算机系统的程序集合 并发:宏观上是同时发生,但是再微观是交替发生的(若干事件在同一时间间隔内发生,单CPU) 并行:微观上同时发生(要求多个CPU) 共享:系统的资源可以…

2025.6.16-实习

2025.6.18--2025.6.23 1.使用Cocos&#xff0c;从0开发老虎棒子鸡2D游戏。实现&#xff1a;AI自动选择&#xff0c;倒计时&#xff0c;对战逻辑&#xff0c;播放动画&#xff0c;设置背景音乐等功能。 2.使用Cocos&#xff0c;开发2D手术游戏。实现&#xff1a;视频、音频控制播…

构建你的 AI 模块宇宙:Spring AI MCP Server 深度定制指南

引言&#xff1a;当模块化遇见 AI 在微服务架构的海洋中&#xff0c;MCP&#xff08;Module Communication Protocol&#xff09;就像一艘智能帆船&#xff0c;它让不同 AI 模块的通信变得优雅而高效。本文将带你构建一艘属于自己的 AI 智能帆船——自定义 Spring AI MCP Serv…

从数据到洞察:UI前端如何利用大数据优化用户体验

hello宝子们...我们是艾斯视觉擅长ui设计、前端开发、数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩! 在当今数字化时代&#xff0c;数据如同蕴藏着无限价值的宝藏&#xff0c;源源不断地产生并积累…

SQLite3 在嵌入式C环境中存储音频/视频文件的专业方案

SQLite3 在嵌入式C环境中存储音频/视频文件的专业方案 在嵌入式系统中存储大型媒体文件需要平衡存储效率、访问速度和资源限制。以下是针对嵌入式C环境的优化方案&#xff1a; 一、存储策略选择 1. 直接存储 vs 文件路径存储 方法优点缺点适用场景BLOB直接存储数据一致性高…

区块链技术概述:从比特币到Web3.0

目录 区块链技术概述&#xff1a;从比特币到Web3.0引言&#xff1a;数字革命的下一篇章1. 区块链技术基础1.1 区块链定义与核心特征1.2 区块链数据结构可视化 2. 比特币&#xff1a;区块链的开端2.1 比特币的核心创新2.2 比特币交易生命周期 3. 以太坊与智能合约革命3.1 以太坊…

Petrel导入well数据

加载井口位置数据&#xff1a;井头文件应包括name, X, Y, KB, TD这些基本信息&#xff0c;文件格式为txt或prn格式都可。具体步骤&#xff1a;① input面板下右键import file&#xff0c;进入import file界面&#xff0c;选择文件格式well heads&#xff08;*.*&#xff09…

51c嵌入式~电路~合集8

我自己的原文哦~ https://blog.51cto.com/whaosoft/12175265 一、高频电路布线的十大绝招 1 多层板布线 高频电路往往集成度较高&#xff0c;布线密度大&#xff0c;采用多层板既是布线所必须&#xff0c;也是降低干扰的有效手段。在PCB Layout阶段&#xff0c;合理的…

【LLM学习笔记3】搭建基于chatgpt的问答系统(下)

目录 一、检查结果检查有害内容检查是否符合产品信息 二、搭建一个简单的问答系统三、评估输出1.当存在一个简单的正确答案2.当不存在一个简单的正确答案 一、检查结果 本章将引领你了解如何评估系统生成的输出。在任何场景中&#xff0c;无论是自动化流程还是其他环境&#x…

多项目资料如何统一归档与权限管理

在多项目管理环境中&#xff0c;统一资料归档与权限管控的关键在于&#xff1a;规范化文件结构、自动化归档流程、分级权限控制。其中&#xff0c;规范化文件结构是实现统一归档的第一步&#xff0c;它直接决定后续归类、检索和审计的效率。通过预设项目模板&#xff0c;明确文…

【RTP】基于mediasoup的RtpPacket的H.264打包、解包和demo 1:不含扩展

目前打包、解包没有对扩展进行操作 测试结果 === H.264 RTP Packetization and Depacketization Test ===1. Generating simulated H.264 frames... Generated 6 H.264 frames2. Packetizing H.264 frames to RTP packets...Frame #0 (size: 1535 bytes, I-fra

【AI论文】Sekai:面向世界探索的视频数据集

摘要&#xff1a;视频生成技术已经取得了显著进展&#xff0c;有望成为交互式世界探索的基础。然而&#xff0c;现有的视频生成数据集并不适合用于世界探索训练&#xff0c;因为它们存在一些局限性&#xff1a;地理位置有限、视频时长短、场景静态&#xff0c;以及缺乏关于探索…