Использование System.Text.Json в качестве сериализатора по умолчанию в ASP.NET Ядро 2.1

#c# #asp.net-core #.net-core #json.net #asp.net-core-2.1

#c# #asp.net-core #.net-ядро #json.net #asp.net-core-2.1

Вопрос:

Для моего конкретного приложения .NET Core 2.1 я провел сравнительный анализ этого System.Text.Json работает намного лучше, чем Newtonsoft. Я знаю, что это значение по умолчанию в .NET Core 3.x, но я пока не могу перейти на него.

В отдельных конечных точках я могу сериализовать с помощью System.Text.Json без проблем

 System.Text.Json.JsonSerializer.Serialize(data, options);
  

Но мне не ясно, как бы я сделал это по умолчанию для всего приложения. Если бы я должен был настроить JsonOptions в Startup.cs , SerializerSettings объект является частью Newtonsoft.

 .AddJsonOptions(options =>
{
    options.SerializerSettings...
});
  

Есть ли способ изменить сериализатор Json по умолчанию для приложения .NET Core 2.1?

Комментарии:

1. Я полагаю, вы могли бы создать пользовательский форматировщик для System.Text.Json в ASP.NET Ядро 2.1, см. learn.microsoft.com/en-us/aspnet/core/web-api/advanced /… . Исходный код для JsonOutputFormatter в asp.net Здесь есть пункт 2.1, так что вы могли бы использовать его в качестве модели.

Ответ №1:

Похоже, вы можете попробовать использовать пользовательскую реализацию форматеров ввода / вывода.

Есть пример использования protobuf для обработки сериализации. https://dejanstojanovic.net/aspnet/2018/september/custom-input-and-output-serializers-in-aspnet-core/

Я думаю, вам будет больше всего интересно ознакомиться с официальной документацией MSDN здесь:

https://learn.microsoft.com/en-us/aspnet/core/web-api/advanced/custom-formatters?view=aspnetcore-2.1

    public class JsonInputFormatter : TextInputFormatter, IInputFormatterExceptionPolicy
    {
        public InputFormatterExceptionPolicy ExceptionPolicy { get; }

        public JsonInputFormatter()
        {
            SupportedMediaTypes.Add(MediaTypeHeaderValue.Parse("application/json"));

            SupportedEncodings.Add(Encoding.UTF8);
            SupportedEncodings.Add(Encoding.Unicode);
        }

        public override async Task<InputFormatterResult> ReadRequestBodyAsync(InputFormatterContext context, Encoding encoding)
        {
            string request = null;
            using(var sr = new StreamReader(context.HttpContext.Request.Body))
            {
                request = await sr.ReadToEndAsync();
            }
            var result = JsonSerializer.Deserialize(request, context.ModelType);
            return await InputFormatterResult.SuccessAsync(result);
        }
    }
  

Комментарии:

1. Действительно, никаких проблем с установкой пакета. Проблема в том, как я бы использовал это в качестве сериализатора Json по умолчанию в ASP.NET Приложение ядра 2.1. Как изменить Startup.cs, чтобы начать использовать это, а не Newtonsoft

2. Упс, пропустил эту часть. Я думал, ваш вопрос в том, как использовать System.Text. Json в 2.1 … я скоро обновлю свой ответ.