Не Используйте JSON-Сериализатор Напрямую в Коде. Окончание
Начало
Но что, если вы не можете внедрить ISerializer?
В этом случае вы можете зарегистрировать JsonSerializerOptions в DI-контейнере и использовать их напрямую:
using System.Text.Json;
var builder = WebApplication.CreateBuilder();
// добавьте сюда ваши настройки по умолчанию
var jsonSerializerOptions =
new JsonSerializerOptions(…);
builder.Services.AddSingleton<JsonSerializerOptions>(
jsonSerializerOptions);
Даже если у вас нет специфических настроек, лучше внедрить JsonSerializerOptions, задать свойства по умолчанию и использовать их везде, где требуется сериализация данных. Это важно, потому что библиотека может измениться, и её настройки по умолчанию также могут измениться. Если вы полагаетесь на настройки по умолчанию библиотеки, после обновления вы можете столкнуться с неожиданным поведением. Например, одно из обновлений Newtonsoft.Json изменило настройку по умолчанию о включении в JSON свойств со значением null. В предыдущей версии они включались, а в новой перестали.
Но в некоторых случаях и этого может быть недостаточно.
Например, при реализации пользовательского IResult путем расширения Results.Extensions нет возможности внедрить ни ISerializer, ни JsonSerializerOptions.
Тогда можно создать статический вспомогательный класс и использовать его.
Регистрация:
csharp
using System.Text.Json;
var builder = WebApplication.CreateBuilder();
var jsonSerializerOptions
= new JsonSerializerOptions(…);
JsonSerializerOptionsProvider.Options
= jsonSerializerOptions;
builder.Services.AddSingleton<JsonSerializerOptions>(jsonSerializerOptions);
static class JsonSerializerOptionsProvider
{
public static JsonSerializerOptions
Options { get; set; }
}
Использование:
csharp
public sealed class ErrorResult<TError>(TError error) : IResult
{
public Task ExecuteAsync(HttpContext ctx)
{
ctx.Response.StatusCode =
(int)HttpStatusCode.BadRequest;
return ctx.Response.WriteAsJsonAsync(
error,
JsonSerializerOptionsProvider.Options);
}
}
Источник: https://medium.com/@denmaklucky/dont-use-a-json-serializer-directly-in-your-code-instead-do-this-72f8eff3fdc5