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

.NET Core: Remove null fields from API JSON response

在 .NET Core 1.0 的全局级别(所有 API 响应),我如何配置 Startup.cs 以便空字段在 JSON 响应中为 removed/ignored ?

使用 Newtonsoft.Json,您可以将以下属性应用于 属性,但我想避免将其添加到每个属性:

[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public string FieldName { get; set; }
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public string OtherName { get; set; }
.NET 核心 1.0

Startup.cs中,您可以将JsonOptions附加到服务集合并设置各种配置,包括删除空值,其中:

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

代替这一行:

options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;

使用:

options.JsonSerializerOptions.IgnoreNullValues = true;
.NET 5.0

代替上面的两种变体,使用:

 options.JsonSerializerOptions.DefaultIgnoreCondition 
                       = JsonIgnoreCondition.WhenWritingNull;

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

如果您不想修改全局行为,也可以针对每个控制器完成此操作:

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

以下适用于 .NET Core 3.0,在 Startup.cs > ConfigureServices():

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

下面的代码适用于 .Net core 2.2

services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

我发现对于 dotnet core 3 这解决了它 -

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

在Asp.Net核心你也可以在action方法中做,通过返回

return new JsonResult(result, new JsonSerializerOptions
{
   IgnoreNullValues = true,
});

net 5中其实是DefaultIgnoreCondition:

public void ConfigureServices(IServiceCollection services)
{
   services.AddControllers()
           .AddJsonOptions(options =>
                {
 options.JsonSerializerOptions.DefaultIgnoreCondition =
        System.Text.Json.Serialization.JsonIgnoreCondition.WhenWritingNull;
                });
        }

这将防止任何 null 值的序列化和反序列化,而不需要属性上的任何额外属性。

我在我的 .net 核心 v3.1 MVC 中使用了以下内容 api。

 services.AddMvc().AddJsonOptions(options =>
            {

                options.JsonSerializerOptions.DefaultIgnoreCondition = System.Text.Json.Serialization.JsonIgnoreCondition.WhenWritingNull;
            });

.Net 核心 6 最小 API:

using Microsoft.AspNetCore.Http.Json;

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

在 .Net 5 及更高版本中,如果您使用 AddNewtonsoftJson 而不是 AddJsonOptions,则设置如下

 services.AddMvc(options =>
                    {
                       //any other settings
                    })
                    .AddNewtonsoftJson(options =>
                    {
                        options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
                    });

如果您想将此应用到特定属性并且只使用 System.Text.Json 那么您可以像这样装饰属性

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

.Net 6 中的另一种方法,用于特定的 ObjectResult:

public class IdentityErrorResult : BadRequestObjectResult
{
    public IdentityErrorResult([ActionResultObjectValue] object? error) : base(error)
    {
        Formatters.Add(new SystemTextJsonOutputFormatter(new JsonSerializerOptions
        {
            DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull
        }));
    }
}

在控制器中:

public IdentityErrorResult IdentityError(ErrorResponseObject value)
  => new IdentityErrorResult(value);