.NET7 Web API中EF7 JSON列中文避免转Unicode的配置方法
解决EF Core 7 JSON列中非ASCII字符被Unicode编码的问题
问题原因
EF Core 默认使用 System.Text.Json 序列化JSON列内容时,会将中文、日文等非ASCII字符转义为\uXXXX格式的Unicode编码,导致SQL Server中存储的不是原始字符。
解决方案
通过配置JSON列的序列化选项,指定不转义非ASCII字符的编码器即可解决。
修改DbContext配置
在OnModelCreating方法中,为ToJson指定自定义的JsonSerializerOptions,设置Encoder为JavaScriptEncoder.UnsafeRelaxedJsonEscaping:
public class ApplicationDBContext : DbContext { public ApplicationDBContext(DbContextOptions<ApplicationDBContext> options) : base(options) { } protected override void OnModelCreating(ModelBuilder builder) { builder.Entity<Card>() .OwnsMany(card => card.Translations, b => { b.ToJson(options => { // 禁用非ASCII字符的Unicode转义 options.JsonSerializerOptions.Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping; }); }); } public virtual DbSet<Card> Cards { get; set; } }
注意事项
UnsafeRelaxedJsonEscaping会允许输出未转义的HTML字符,若你的应用处理不可信的用户输入,需谨慎使用,避免XSS风险。如果只是存储可控的多语言翻译内容,这个配置是安全的。- 顺便修正你代码中的两处小问题:
ApplicationDBContext构造函数的括号未闭合(已在上面代码中修正)CardTranslation类中的laungaugeId拼写错误,建议改为LanguageId(符合C#命名规范)
验证效果
配置完成后,再次插入包含中文的Card数据,SQL Server中的JSON列会直接存储"name": "你好"而非"name": "\u4F60\u597D",查询时也会返回原始字符。
内容的提问来源于stack exchange,提问作者Ahmed Hesham
相关产品推荐
相关产品推荐

