在 ef core 中操作復雜類型的序列化和反序列化時,如何全局設置 utf-8 編碼避免中文字符被轉義?

我們在使用 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;以及缺乏關于探索…