You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:46:29