Как получить настройки json сериализатора через DI (набор служб) в asp netcore 3.1 mvc при использовании AddNewtonsoftJson - PullRequest
0 голосов
/ 11 февраля 2020

У меня есть проект ASP MVC с использованием .netcore 3.1, где я переопределяю параметры сериализатора, как показано ниже:

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

Это прекрасно работает, когда MVC сериализует данные (запрос / ответ) ) для меня. Но теперь в одном из промежуточных программ мне нужно сериализовать вручную и вернуть некоторые данные в виде ответа, например:

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?

Ответы [ 2 ]

1 голос
/ 12 февраля 2020

Здесь я хочу повторно использовать существующие настройки для сериализации.

Поскольку вы настроили параметры Newtonsoft Json для Mvc в методе ConfigureServices (), просто введите 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));
        }
    }
}
0 голосов
/ 11 февраля 2020

Я считаю, что вам нужно отправить данные как 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...