Reputation: 3970
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
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
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
Reputation:
The migration guide for Net Core 2.2 -> 3.0 has this information
The jist, you can use it you just have to manually add the package since its no longer included by default
Add the following to your Startup.ConfigureServices method
services.AddMvc()
.AddNewtonsoftJson();
Configure
Upvotes: 4