ASP.NET Core配置NewtonsoftJson全局序列化设置不生效如何解决?
现有配置的问题
你目前的配置存在3个核心问题,导致MVC管道的入参、返回值序列化未生效:
- 配置挂载位置错误:
AddNewtonsoftJson必须作为AddControllers/AddMvc/AddControllersWithViews的链式调用方法执行,单独向IServiceCollection注册AddNewtonsoftJson不会被MVC的输入/输出格式化器管道识别。 - 配置逻辑执行时机错误:你将
JsonConvert.DefaultSettings的赋值放到了AddNewtonsoftJson的配置委托内部,该委托仅在MVC创建专属序列化器实例时触发,仅能保证你手动调用JsonConvert静态方法时生效,和MVC管道使用的序列化器配置没有直接关联。 - 绑定源匹配问题:只有标注
[FromBody]的参数才会走JSON反序列化流程,[FromQuery]/[FromRoute]等绑定源走的是通用模型绑定逻辑,不会应用JSON序列化配置;如果你的项目同时保留了默认的System.Text.Json格式化器配置,也会因为优先级冲突导致Newtonsoft配置不生效。
修复步骤
- 修正配置挂载逻辑,确保
AddNewtonsoftJson挂载在控制器注册的链式调用上,同时移除AddNewtonsoftJson委托内部的JsonConvert.DefaultSettings赋值,如需全局静态方法生效可单独在外部配置:
services.AddControllers(options => { // 可选:移除默认的System.Text.Json格式化器,避免优先级冲突 options.OutputFormatters.RemoveType<SystemTextJsonOutputFormatter>(); options.InputFormatters.RemoveType<SystemTextJsonInputFormatter>(); }) .AddNewtonsoftJson(options => { options.UseMemberCasing(); options.SerializerSettings.DateFormatHandling = Newtonsoft.Json.DateFormatHandling.MicrosoftDateFormat; options.SerializerSettings.FloatParseHandling = Newtonsoft.Json.FloatParseHandling.Double; options.SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.Utc; options.SerializerSettings.TraceWriter = new NLogTraceWriter(); options.SerializerSettings.Culture = CultureInfo.InvariantCulture; }); // 如需手动调用JsonConvert时也生效,单独在此处配置即可 JsonConvert.DefaultSettings = () => new JsonSerializerSettings { DateFormatHandling = Newtonsoft.Json.DateFormatHandling.MicrosoftDateFormat, FloatParseHandling = Newtonsoft.Json.FloatParseHandling.Double, DateTimeZoneHandling = DateTimeZoneHandling.Utc, TraceWriter = new NLogTraceWriter(), Culture = CultureInfo.InvariantCulture };
- 确保你已经安装了和项目框架版本匹配的
Microsoft.AspNetCore.Mvc.NewtonsoftJsonNuGet包。 - 所有需要走JSON反序列化的入参必须标注
[FromBody]属性,返回值如果是IActionResult类型,直接返回Ok(yourObject)即可,不需要手动序列化。 - 如果你使用的是ASP.NET Core 6+的最小API(Minimal API),默认不直接支持Newtonsoft.Json序列化,需要额外替换最小API的默认输入输出格式化器,或改用控制器模式。
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

