.NET Core:从API JSON响应中删除空字段

93

在.NET Core 1.0(所有API响应)的全局水平上,我如何配置Startup.cs以便在JSON响应中删除/忽略空字段?

使用Newtonsoft.Json,您可以将以下属性应用于属性,但我想避免不得不添加到每个单独的属性中:

[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public string FieldName { get; set; }
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public string OtherName { get; set; }
15个回答

181
.NET Core 1.0

Startup.cs 中,您可以将 JsonOptions 添加到服务集合中,并设置各种配置,包括在那里移除空值:

public void ConfigureServices(IServiceCollection services)
{
     services.AddMvc()
             .AddJsonOptions(options => {       
                  options.SerializerSettings
                         .NullValueHandling = NullValueHandling.Ignore;
     });
}
.NET Core 3.1

不要使用这行代码:

options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;

使用:

options.JsonSerializerOptions.IgnoreNullValues = true;
.NET 5.0

不要使用上述两个变体,使用:

 options.JsonSerializerOptions.DefaultIgnoreCondition 
                       = JsonIgnoreCondition.WhenWritingNull;

.NET Core 3.1版本的变体仍然有效,但被标记为NonBrowsable(因此您永远不会收到关于此参数的智能感知提示),因此很可能在某个时候被弃用。


3
我的API返回一个包含多个其他复杂节点的复杂对象。即使有空值,这些键也会在响应JSON中显示。尝试了这个解决方案,但它并不起作用。如果响应JSON包含复杂对象,那么这个解决方案行不行? - Aravind
1
@Aravind 我使用了一个错误中间件,当出现异常时会再次设置响应格式,并在那里设置另一个json选项。我不得不在那里做同样的代码才能使它工作。也许你正在使用中间件或在Startup.cs之外的任何地方设置JSON配置。它应该在所有.NET Core版本中都像答案一样工作,直到现在为止(我正在使用最新发布的2.2)。它也应该可以很好地处理复杂对象。 - Edgar Froes
6
我面临着类似的情况,但是想要在控制器中仅消除特定API端点的Null值,而非全部。有没有一种方式可以实现这个需求? - Quest
1
不确定是否会更改,但在.NET Core 3 RC1中,它是options.JsonSerializerOptions.IgnoreNullValues = true; - slopapa
1
.NET 6与.NET 5相同。 - José Mancharo
显示剩余3条评论

28

如果您不想修改全局行为,则还可以按控制器进行操作:

public IActionResult GetSomething()
{
   var myObject = GetMyObject();
   return new JsonResult(myObject, new JsonSerializerSettings() 
   { 
       NullValueHandling = NullValueHandling.Ignore 
   });
};

16

我发现对于.NET Core 3可以解决这个问题 -

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


10
在.NET 5中,实际上是使用DefaultIgnoreCondition
public void ConfigureServices(IServiceCollection services)
{
   services.AddControllers()
           .AddJsonOptions(options =>
                {
 options.JsonSerializerOptions.DefaultIgnoreCondition =
        System.Text.Json.Serialization.JsonIgnoreCondition.WhenWritingNull;
                });
        }

这将防止任何空值的序列化和反序列化,而无需在属性上添加任何额外的属性。

1
谢谢您添加这个。正如您所见,这是一个相当古老的问题,答案会随着.NET Core的发展而改变。 - dotNetkow
1
@dotNetkow 嗯,看起来他们喜欢每个主要版本都大幅更改这些东西,哈哈。 - briosheje
1
尊重答案!对于每次发布都需要搜索这些内容,我们不尊重 .Net 团队。 - Pavel Biryukov

8

.Net Core 6 带有极简API:

using Microsoft.AspNetCore.Http.Json;

builder.Services.Configure<JsonOptions>(options => 
         options.SerializerOptions.DefaultIgnoreCondition 
   = JsonIgnoreCondition.WhenWritingDefault | JsonIgnoreCondition.WhenWritingNull);

7

如果您想将其应用于特定属性,并且仅使用System.Text.Json,则可以像这样装饰属性

[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
public string Market { get; set; }

1
在 .NET 7.0.2 中,它是 System.Text.Json.Serialization.JsonIgnore - Raphaël Colantonio

4
在 .Net 5 及更高版本中,如果您使用的是 AddNewtonsoftJson 而不是 AddJsonOptions,则设置如下所示。
 services.AddMvc(options =>
     {
        //any other settings
     })
     .AddNewtonsoftJson(options =
     {
        options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
     });

2
在Asp.Net Core中,您也可以在操作方法中完成此操作,只需返回相应的HTML代码即可。
return new JsonResult(result, new JsonSerializerOptions
{
   IgnoreNullValues = true,
});

2
以下适用于.NET Core 3.0,在Startup.cs > ConfigureServices()中实现:
services.AddMvc()
    .AddJsonOptions(options =>
    {
        options.JsonSerializerOptions.IgnoreNullValues = true;
    });

1
对于.NET 8
 builder.Services.AddControllers()
                .AddJsonOptions(o => o.JsonSerializerOptions.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingDefault | JsonIgnoreCondition.WhenWritingNull);

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