如何在使用 AddNewtonsoftJson 时通过 asp netcore 3.1 mvc 中的 DI(服务集合)检索 json 序列化程序设置

How to retrieve json serializer settings via DI (service collection) in asp netcore 3.1 mvc while using AddNewtonsoftJson

我有一个使用 .netcore 3.1 的 ASP MVC 项目,我在其中重写序列化程序选项,如下所示

services
.AddControllers()
.AddNewtonsoftJson(options =>
{
    options.SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind;
    options.SerializerSettings.NullValueHandling = NullValueHandling.Include;
    options.SerializerSettings.Converters.Add(new StringEnumConverter
    {
        NamingStrategy = new CamelCaseNamingStrategy(),
    });
})

每当 MVC 为我序列化数据 (request/response) 时,这都能正常工作。 但是现在,在其中一个中间件中,我需要手动序列化 return 一些数据作为响应,例如:

public async Task Invoke(HttpContext context)
{
    try
    {
        await _next(context);
    }
    catch (Exception exception)
    {
        ... // removed for simplicity
        await context.Response.WriteAsync(JsonConvert.SerializeObject(errorResponse, _jsonSerializerSettings));
    }
}

在这里我想重复使用现有的设置进行序列化。但是旧的 MvcJsonOptions 在 .netcore 3.1 中不再可用(如果我错了请更正)。 那么如何在不复制 json 序列化设置的情况下实现这一目标呢?

我认为您需要将数据发送为 json。

添加以下命名空间

using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;

然后它将提供数据的序列化。

var response = 'Your Model or list';
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.ContractResolver=new DefaultContractResolver();
return Json(new {data = response}, settings);

Here I want to reuse existing settings for serialization.

由于您已经在 ConfigureServices() 方法中配置了 NewtonsoftJson Options For Mvc,因此只需在需要时注入 IOptions<MvcNewtonsoftJsonOptions> 即可。例如,更改您的中间件以接受 IOptions<MvcNewtonsoftJsonOptions>:

的参数
public class MyMiddleware
{
    private readonly RequestDelegate _next;
    private readonly JsonSerializerSettings _jsonSerializerSettings;

    public MyMiddleware(RequestDelegate next,IOptions<MvcNewtonsoftJsonOptions> jsonOptions)
    {
        // ... check null and throw
        this._next = next;
        this._jsonSerializerSettings = jsonOptions.Value.SerializerSettings;
    }

    public async Task Invoke(HttpContext context) 
    {
        try
        {
            await _next(context);
        }
        catch (Exception exception)
        {
            //... removed for simplicity
            await context.Response.WriteAsync(JsonConvert.SerializeObject(errorResponse, _jsonSerializerSettings));
        }
    }
}