如何在ASP.NET Core中关闭JsonResults的字符转义

piok6c0g  于 2023-04-22  发布在  .NET
关注(0)|答案(1)|浏览(242)

我最近将一个应用程序从使用.NET Framework转换为使用.NET Core,在此过程中,由于在返回某些字符时转义了它们,我的一些端点已经停止产生预期的结果。
我的控制器大致看起来像这样:

class MyController
{
    [HttpGet]
    [Authenticated]
    public async Task<ActionResult> GetMyObject(string id)
    {
        var myObj = // Controller specific code to look up the object
        return new JsonResult(myObj);
    }
}

这是以前返回这样的结果:

{"HtmlTemplate":"
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
 <link href='https://fonts.googleapis.com/css?family=Nunito+Sans' rel='stylesheet' />
 <style>

而现在看起来

{"htmlTemplate":"
\u003C!DOCTYPE html\u003E
\u003Chtml lang=\u0022en\u0022 xmlns=\u0022http://www.w3.org/1999/xhtml\u0022\u003E
\u003Chead\u003E
 \u003Clink href='https://fonts.googleapis.com/css?family=Nunito\u002BSans' rel='stylesheet' /\u003E
 
 \u003Cstyle\u003E

我对修改端点的调用者的控制较少,所以我想在这个应用程序中解决这个问题。我熟悉如何更改序列化程序(如here)的格式,但我不知道如何设置这里的参数,因为它是隐式的。

von4xj4u

von4xj4u1#

您需要配置JsonOptions

using Microsoft.AspNetCore.Mvc;

// ...
builder.Services.Configure<JsonOptions>(options =>
    options.JsonSerializerOptions.Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping);

请注意,有2个JsonOptions,一个来自Microsoft.AspNetCore.Mvc命名空间,一个来自Microsoft.AspNetCore.Http.Json命名空间,对于控制器,您需要前者。
另一种方法可以是使用所需的设置“手动”序列化并返回ContentResult(如果需要,以每个端点为基础处理此操作)。

相关问题