ASP.Net Core 2.2如何为输入与输出设置独立的序列化配置?
嘿,这个需求我之前也碰到过——ASP.NET Core 2.2里默认的MvcJsonOptions确实会把序列化和反序列化的设置绑在一起,没法分开调整。不过有两种很实用的办法能实现你要的「输入忽略null错误,输出保留null字段」的效果,我给你一步步讲清楚:
方法1:使用官方扩展AddNewtonsoftJson(推荐)
ASP.NET Core 2.2开始支持AddNewtonsoftJson扩展方法(需要先安装Microsoft.AspNetCore.Mvc.NewtonsoftJson NuGet包),它允许我们分别为输入(反序列化)和输出(序列化)配置独立的Json.NET设置,非常简洁:
public void ConfigureServices(IServiceCollection services) { services.AddMvc() .AddNewtonsoftJson(options => { // 先配置全局通用的设置(比如驼峰命名,可选) options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); // 输入反序列化:忽略null值,避免非可空字段传null时报错 options.InputFormatterSettings.NullValueHandling = NullValueHandling.Ignore; // 输出序列化:保留null值,确保模型里的null字段能被输出 options.OutputFormatterSettings.NullValueHandling = NullValueHandling.Include; }) .SetCompatibilityVersion(CompatibilityVersion.Version_2_2); }
方法2:自定义Json格式化器(底层实现方式)
如果不想用扩展包,也可以手动替换默认的Json输入/输出格式化器,给它们各自指定不同的序列化配置:
public void ConfigureServices(IServiceCollection services) { services.AddMvc(options => { // 移除默认的Json格式化器 var defaultInputFormatter = options.InputFormatters.OfType<JsonInputFormatter>().FirstOrDefault(); if (defaultInputFormatter != null) { options.InputFormatters.Remove(defaultInputFormatter); } var defaultOutputFormatter = options.OutputFormatters.OfType<JsonOutputFormatter>().FirstOrDefault(); if (defaultOutputFormatter != null) { options.OutputFormatters.Remove(defaultOutputFormatter); } // 配置输入序列化设置:NullValueHandling.Ignore var inputSerializerSettings = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore, ContractResolver = new CamelCasePropertyNamesContractResolver() }; options.InputFormatters.Add(new JsonInputFormatter( options, inputSerializerSettings, ArrayPool<char>.Shared, new DefaultObjectPoolProvider(), options.ModelMetadataDetailsProviders, Options.Create(new MvcJsonOptions()))); // 配置输出序列化设置:NullValueHandling.Include var outputSerializerSettings = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Include, ContractResolver = new CamelCasePropertyNamesContractResolver() }; options.OutputFormatters.Add(new JsonOutputFormatter( outputSerializerSettings, ArrayPool<char>.Shared)); }).SetCompatibilityVersion(CompatibilityVersion.Version_2_2); }
验证效果
按照上面的配置后:
- 当客户端传入JSON
{ id: null, parentId: null, name: "test" }时,反序列化到SomeEntity模型不会报错:Id(非可空int)会被设为默认值0,ParentId设为null,Name设为"test"; - 当序列化
new SomeEntity { Id = 1, ParentId = null, Name = "test" }时,输出的JSON会保留parentId: null字段,结果为{ id: 1, parentId: null, name: "test" }。
内容的提问来源于stack exchange,提问作者Eugene
相关产品推荐
相关产品推荐

