OnoSendai
OnoSendai

Reputation: 3970

Alternatives to JsonOutputFormatter in ASP.NET Core 3.1 at Controller Level

I have a custom filter attribute adapted from this answer currently implemented for .NET Core 2.2 that I would like to adapt to 3.1. It references Newtonsoft.JSON and I would prefer to keep it that way for compatibility reasons.

The code follows:

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 is only supported up to .net core 2.2, according to the official documentation; how should I proceed to keep the same behavior under 3.1?

Upvotes: 5

Views: 8061

Answers (3)

SanBen
SanBen

Reputation: 2808

.Net Core 3 brings with it its own JSON capabilities and does not include Json.Net anymore by default.

As an alternative, if this is possible, you can use the native SystemTextJsonOutputFormatter instead of including another package.

using Microsoft.AspNetCore.Mvc.Formatters;

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);
}

Upvotes: 4

Mike Zboray
Mike Zboray

Reputation: 40838

The equivalent of the old JsonOutputFormatter is NewtonsoftJsonOutputFormatter in the Microsoft.AspNetCore.Mvc.NewtonsoftJson package. It has one minor change, where it will accept an MvcOptions in the constructor as well:

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

This is only really affects the behavior via the SuppressOutputFormatterBuffering option. You might be able to resolve it from the RequestServices or you can just create a new one on the fly.

Upvotes: 14

user12447201
user12447201

Reputation:

The migration guide for Net Core 2.2 -> 3.0 has this information

Migration guide

The jist, you can use it you just have to manually add the package since its no longer included by default

  • Add a package reference to AspNetCore.Mvc.NewtonsoftJson
  • Add the following to your Startup.ConfigureServices method

      services.AddMvc()
          .AddNewtonsoftJson();
    
  • Configure

Upvotes: 4

Related Questions