You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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特殊字符(如<转为&lt;),System.Text.Json默认不转义这类字符。

你可以通过以下两种方式调整,让.NET Core的JsonResult行为和.NET Framework保持一致:


方式一:全局配置(推荐,统一所有接口行为)

直接将.NET Core的默认JSON序列化器切换回Newtonsoft.Json,完全对齐旧框架的行为:

  1. 安装NuGet包
    在项目中安装Microsoft.AspNetCore.Mvc.NewtonsoftJson包(根据你的.NET Core版本选择对应版本)。

  2. 配置序列化选项
    在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 11:42:11