在ASP.NET Web API中,抑制具有空值的属性

102
我创建了一个ASP.Net WEB API项目,将被移动应用程序使用。我需要响应的JSON省略空属性,而不是将它们作为property: null返回。
我该怎么做?
7个回答

143

WebApiConfig 文件中:

config.Formatters.JsonFormatter.SerializerSettings = 
                 new JsonSerializerSettings {NullValueHandling = NullValueHandling.Ignore};

或者,如果你想要更多的控制权,你可以替换整个格式化器:

var jsonformatter = new JsonMediaTypeFormatter
{
    SerializerSettings =
    {
        NullValueHandling = NullValueHandling.Ignore
    }
};

config.Formatters.RemoveAt(0);
config.Formatters.Insert(0, jsonformatter);

2
很遗憾config.Formatters.XmlFormatter没有相同的属性... :/ - RoboJ1M
9
自 Json.NET 5(之前版本不确定),您也可以这样做:config.Formatters.JsonFormatter.SerializerSettings.NullValueHandling = NullValueHandling.Ignore - 这将更新空值处理,而不会重置任何其他 JSON 序列化设置(比如在属性的首字母上使用小写)。 - Ivaylo Slavov
9
能否仅针对单个属性实现这个操作? - Martin Brown
1
NullValueHandling = NullValueHandling.Ignore 对我的结果没有起作用。 - Nathan Tregillus
4
如果更改应该在每个属性的基础上进行,并且正在使用足够新的Json.Net版本,则可以在属性上使用此属性:[JsonProperty(NullValueHandling = NullValueHandling.Ignore)] - Carsten Führmann
显示剩余4条评论

33

我在使用ASP.NET5 1.0.0-beta7时,在startup.cs文件中得到了这段代码。

services.AddMvc().AddJsonOptions(options =>
{
    options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
});

22

对于ASP.NET Core 3.0,在Startup.cs代码中,ConfigureServices()方法应包含以下内容:

services.AddControllers()
    .AddJsonOptions(options =>
    {
        options.JsonSerializerOptions.IgnoreNullValues = true;
    });

这是最佳选择,因为在API(没有MVC)上,您没有实现MVC。 - CodeRush

8

您还可以使用 [DataContract][DataMember(EmitDefaultValue=false)] 属性。


1
这是唯一一个涵盖XML和JSON响应的答案。 - ColmanJ

5
如果您正在使用vnext,在vnext web api项目中,请在startup.cs文件中添加以下代码。
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc().Configure<MvcOptions>(options =>
        {
            int position = options.OutputFormatters.FindIndex(f =>  f.Instance is JsonOutputFormatter);

            var settings = new JsonSerializerSettings()
            {
                NullValueHandling = NullValueHandling.Ignore
            };

            var formatter = new JsonOutputFormatter();
            formatter.SerializerSettings = settings;

            options.OutputFormatters.Insert(position, formatter);
        });

    }

3

由于我的声望较低,无法进行评论。补充Dave Wegner的答案,因为它已经过时了,当前的解决方案是:

services.AddControllers().AddJsonOptions(options =>
            options.JsonSerializerOptions.DefaultIgnoreCondition = System.Text.Json.Serialization.JsonIgnoreCondition.WhenWritingNull
        );

0
builder.Services.AddControllersWithViews().AddJsonOptions(options =>
{  
    options.JsonSerializerOptions.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull;
});

2
你的回答可以通过添加额外的支持信息来改进。请[编辑]以添加进一步的细节,如引用或文档,以便其他人可以确认你的回答是否正确。你可以在帮助中心找到关于如何撰写好回答的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接