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

Posted

技术标签:

【中文标题】.NET Core:从 API JSON 响应中删除空字段【英文标题】:.NET Core: Remove null fields from API JSON response 【发布时间】:2017-06-16 17:35:49 【问题描述】:

在 .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; 

【问题讨论】:

【参考方案1】:

[.NET Core 1.0]

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

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(因此您永远不会收到有关此参数的 IntelliSense 提示),因此它很可能在某个时候会被淘汰。

【讨论】:

我的 API 返回一个具有多个其他复杂节点的复杂对象。即使有空值/空值,这些键也会在响应 json 中看到。尝试了这个解决方案,但它不起作用。如果响应 json 有复杂的对象,这将不起作用吗? @Aravind 嗯,不确定。 FWIW,这是针对 .NET Core 1.0 的。也许对于较新的版本,您可以寻找更好的答案。 @Aravind 我使用了一个错误中间件,它在发生异常时再次设置响应格式,并在那里设置了另一个 json 选项。也必须在那里执行相同的代码才能正常工作。也许您在 Startup.cs 以外的任何地方使用设置 JSON 配置的中间件。到目前为止,它应该与所有 .NET Core 版本中的 answear 完全相同(我使用的是最新发布的 2.2)。它也应该适用于复杂的对象。 我面临着类似的情况,但想删除控制器中特定给定 API 端点的 Null 值,而不是全部。有没有办法我们可以做到这一点 不确定它是否会改变,但在 .NET Core 3 RC1 中是 options.JsonSerializerOptions.IgnoreNullValues = true;【参考方案2】:

如果您不想修改全局行为,也可以按控制器执行此操作:

public IActionResult GetSomething()

   var myObject = GetMyObject();
   return new JsonResult(myObject, new JsonSerializerSettings() 
    
       NullValueHandling = NullValueHandling.Ignore 
   );
;

【讨论】:

【参考方案3】:

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

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

【讨论】:

请考虑详细说明以更好地解释您的答案。 参考:docs.microsoft.com/en-us/aspnet/core/migration/…【参考方案4】:

net 5,其实是DefaultIgnoreCondition

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

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

【讨论】:

感谢您添加此内容。如您所见,这是一个相当古老的问题,随着 .NET Core 的发展,答案也在不断变化。 @dotNetkow 是的,看起来他们非常喜欢每个专业都改变这些,哈哈。 尊重答案!不尊重 .Net 团队需要在每个版本中搜索此类内容...【参考方案5】:

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

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

【讨论】:

【参考方案6】:

在 Asp.Net Core 中,您也可以在 action 方法中执行此操作,方法是返回

return new JsonResult(result, new JsonSerializerOptions

   IgnoreNullValues = true,
);

【讨论】:

【参考方案7】:

.Net core 6 with Minimal API:

using Microsoft.AspNetCore.Http.Json;

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

【讨论】:

【参考方案8】:

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

 services.AddMvc().AddJsonOptions(options =>
            

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

【讨论】:

【参考方案9】:

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

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

【讨论】:

【参考方案10】:

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

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

【讨论】:

以上是关于.NET Core:从 API JSON 响应中删除空字段的主要内容,如果未能解决你的问题,请参考以下文章

.NET Core API 从 Web API 返回响应,不包括 cookie

如何在 JSON 响应 ASP.NET Core 中关闭或处理 camelCasing?

响应“',' 是值的无效开始。路径:$。在 Asp.Net Core API 中

从 .NET Core Web API 调用 SalesForce API 并将响应反序列化为 c# 对象?

这是从 ASP.NET Core Web API 中的 EF Core 5 获得的啥样的响应 [关闭]

ASP.Net Core 2.0 - 如何从中间件返回自定义 json 或 xml 响应?