C# ASP.NET Core 3.1中控制器级JsonOutputFormatter的替代方案
我有一个定制的过滤器属性,它是根据当前为.NET Core 2.2实现的,我想适应3.1。它引用了Newtonsoft.JSON,出于兼容性原因,我更愿意保持这种方式 守则如下:C# ASP.NET Core 3.1中控制器级JsonOutputFormatter的替代方案,c#,asp.net-core,asp.net-core-3.1,C#,Asp.net Core,Asp.net Core 3.1,我有一个定制的过滤器属性,它是根据当前为.NET Core 2.2实现的,我想适应3.1。它引用了Newtonsoft.JSON,出于兼容性原因,我更愿意保持这种方式 守则如下: public class AllPropertiesAttribute : ActionFilterAttribute { public override void OnActionExecuted(ActionExecutedContext ctx) { if (!(ctx.Resul
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);
}
}
公共类所有属性属性:ActionFilterAttribute
{
公共覆盖无效OnActionExecuted(ActionExecuteContext ctx)
{
如果(!(ctx.Result为ObjectResult ObjectResult))返回;
var serializer=newjsonserializersettings{NullValueHandling=NullValueHandling.Include};
添加(新的StringEnumConverter());
var formatter=新的JsonOutputFormatter(序列化程序,
ctx.HttpContext.RequestServices.GetRequiredService;我应该如何继续保持3.1下的相同行为?Net Core 2.2->3.0的迁移指南包含此信息
jist,您可以使用它,您只需手动添加包,因为默认情况下不再包括它
- 添加对AspNetCore.Mvc.NewtonsoftJson的包引用
- 将以下内容添加到Startup.ConfigureServices方法中
services.AddMvc()
.AddNewtonsoftJson();
- 配置
与旧的JsonOutputFormatter等效的是Microsoft.AspNetCore.Mvc.NewtonsoftJson包中的NewtonSofJSONOutputFormatter。它有一个小改动,在构造函数中也接受MVCOPions:
public NewtonsoftJsonOutputFormatter(
JsonSerializerSettings serializerSettings,
ArrayPool<char> charPool,
MvcOptions mvcOptions)
public newtonsoftjsonoutformatter(
JsonSerializerSettings序列化rSettings,
ArrayPool charPool,
mvcopions(mvcopions)
这只会通过选项真正影响行为。您可能可以从RequestServices中解决它,也可以动态创建一个新的。Net Core 3附带了它,默认情况下不再包含Json.Net
作为替代方案,如果这是可能的,您可以使用本机而不是包含另一个包
使用Microsoft.AspNetCore.Mvc.Formatters;
公共覆盖无效OnActionExecuted(ActionExecuteContext ctx)
{
如果(!(ctx.Result为ObjectResult ObjectResult))返回;
var serializer=newjsonserializeroptions{IgnoreNullValues=false};
Add(新的jsonStringUnumConverter());
var formatter=newsystemtextjsonoutputformatter(序列化程序);
objectResult.Formatters.Add(格式化程序);
}
@MikeZboray感谢您的回复-我尝试切换到本机格式化程序的尝试停止了,因为我了解到它的行为方式不同,在发出JSON响应时忽略派生类型的属性;这就是我坚持使用Newtonsoft.JSON的原因,至少目前是这样。更多信息:是的,我错过了您出于兼容性原因,我想继续使用newtonsoft。我认为Mvc.NewtonsoftJson包是您想要查看的地方。具体来说,NewtonsoftJsonOutputFormatter似乎是等效的输出格式化程序。@MikeZboray我不敢相信我错过了那一个-尝试了它,它工作得非常完美,只做了一些小的更改。您能发布一个答案让我知道吗可以接受吗?谢谢Josh,这与我在初始化时的情况非常接近。我的问题的重点略有不同-我希望在控制器级别有不同的序列化行为(即,以不同方式处理响应序列化的方法)不过我还是很感谢你花了这么多时间来回答。谢谢你的回答,SanBen。我最终决定坚持使用NewtonsoftJson,因为JsonOutputFormatter的设计选择——即它忽略了派生类型的属性。