如何在ASP.NET Core中关闭JsonResults的字符转义
解决方案
问题根源
.NET Framework中JsonResult默认使用Newtonsoft.Json(Json.NET)序列化,而.NET Core默认使用System.Text.Json,二者的默认行为差异导致了你的问题:
- 属性命名:Newtonsoft默认保留类的属性名(如
HtmlTemplate),System.Text.Json默认转为驼峰命名(htmlTemplate); - HTML字符转义:Newtonsoft默认会转义HTML特殊字符(如
<转为<),System.Text.Json默认不转义这类字符。
你可以通过以下两种方式调整,让.NET Core的JsonResult行为和.NET Framework保持一致:
方式一:全局配置(推荐,统一所有接口行为)
直接将.NET Core的默认JSON序列化器切换回Newtonsoft.Json,完全对齐旧框架的行为:
安装NuGet包
在项目中安装Microsoft.AspNetCore.Mvc.NewtonsoftJson包(根据你的.NET Core版本选择对应版本)。配置序列化选项
在Program.cs(.NET 6+)或Startup.cs(.NET 5及更早)中添加NewtonsoftJson的配置:
// .NET 6+ Program.cs var builder = WebApplication.CreateBuilder(args); // 添加Mvc服务并配置NewtonsoftJson builder.Services.AddControllers() .AddNewtonsoftJson(options => { // 保留原属性名(不转为驼峰) options.SerializerSettings.ContractResolver = new Newtonsoft.Json.Serialization.DefaultContractResolver(); // 启用HTML字符转义 options.SerializerSettings.StringEscapeHandling = Newtonsoft.Json.StringEscapeHandling.EscapeHtml; }); var app = builder.Build(); // ... 其他中间件配置 app.MapControllers(); app.Run();
这样配置后,所有JsonResult的序列化行为会和.NET Framework完全一致,无需修改控制器代码。
方式二:单个接口配置(仅修改当前接口)
如果不想全局修改,只想针对当前控制器的这个接口调整,可以直接在JsonResult的构造参数中指定序列化选项:
切换到NewtonsoftJson的单接口配置
直接设置JsonResult的SerializerSettings:
public async Task<ActionResult> GetMyObject(string id) { var myObj = // 你的对象查询逻辑 return new JsonResult(myObj) { SerializerSettings = new Newtonsoft.Json.JsonSerializerSettings { ContractResolver = new Newtonsoft.Json.Serialization.DefaultContractResolver(), StringEscapeHandling = Newtonsoft.Json.StringEscapeHandling.EscapeHtml } }; }
保留System.Text.Json的单接口配置
配置JsonSerializerOptions匹配旧行为:
public async Task<ActionResult> GetMyObject(string id) { var myObj = // 你的对象查询逻辑 return new JsonResult(myObj, new JsonSerializerOptions { // 保留原属性名 PropertyNamingPolicy = null, // 启用HTML字符转义(默认行为,可省略) Encoder = System.Text.Encodings.Web.JavaScriptEncoder.Default }); }
内容的提问来源于stack exchange,提问作者Andy
相关产品推荐
相关产品推荐

