web-dev-qa-db-ja.com

コントローラーレベルでのASP.NET Core 3.1のJsonOutputFormatterの代替

この答え から適応したカスタムフィルター属性があり、現在.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コア2.2までのみサポートされています 公式ドキュメントによると ; 3.1で同じ動作を維持するにはどうすればよいですか?

3
OnoSendai

.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);
}
1
SanBen