Альтернативы JsonOutputFormatter в ASP. NET Core 3.1 на уровне контроллера - PullRequest
1 голос
/ 07 января 2020

У меня есть пользовательский атрибут фильтра, адаптированный из этот ответ , в настоящее время реализованный для. NET Core 2.2, который я хотел бы адаптировать к 3.1. Он ссылается на Newtonsoft. JSON, и я бы предпочел оставить его таким по соображениям совместимости.

Код выглядит следующим образом:

public class AllPropertiesAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext ctx)
    {
        if (!(ctx.Result is ObjectResult objectResult)) return;

        var serializer = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Include };
        serializer.Converters.Add(new StringEnumConverter());

        var formatter = new JsonOutputFormatter(serializer, 
                        ctx.HttpContext.RequestServices.GetRequiredService<ArrayPool<char>>());

        objectResult.Formatters.Add(formatter);
    }
}

JsonOutputFormatter поддерживается только до. net core 2.2, согласно официальной документации ; как мне продолжить, чтобы сохранить то же поведение под 3.1?

Ответы [ 3 ]

2 голосов
/ 07 января 2020

Эквивалентом старого JsonOutputFormatter является NewtonsoftJsonOutputFormatter в пакете Microsoft.AspNetCore. Mvc .Newtonsoft Json. У него есть одно незначительное изменение, при котором он также принимает MvcOptions в конструкторе:

    public NewtonsoftJsonOutputFormatter(
        JsonSerializerSettings serializerSettings,
        ArrayPool<char> charPool,
        MvcOptions mvcOptions)

Это действительно влияет только на поведение с помощью опции SuppressOutputFormatterBuffering . Возможно, вам удастся разрешить его с помощью RequestServices или вы можете просто создать новый на лету.

1 голос
/ 07 января 2020

Руководство по миграции для Net Core 2.2 -> 3.0 содержит эту информацию

Руководство по миграции

Jist, вы можете использовать его, вам просто нужно вручную добавьте пакет, поскольку по умолчанию он больше не включается

  • Добавьте ссылку на пакет в AspNetCore. Mvc .Newtonsoft Json
  • Добавьте следующее в свой автозагрузку. Метод ConfigureServices

      services.AddMvc()
          .AddNewtonsoftJson();
    
  • Настройка

0 голосов
/ 06 апреля 2020

. Net Core 3 содержит свои JSON возможности и больше не включает Json. Net по умолчанию.

В качестве альтернативы, если это возможно, вы можете использовать собственный SystemTextJsonOutputFormatter вместо включения другого пакета.

public override void OnActionExecuted(ActionExecutedContext ctx)
{
    if (!(ctx.Result is ObjectResult objectResult)) return;

    var serializer = new JsonSerializerOptions { IgnoreNullValues = false };
    serializer.Converters.Add(new JsonStringEnumConverter());

    var formatter = new SystemTextJsonOutputFormatter(serializer);

    objectResult.Formatters.Add(formatter);
}
...