.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# 对象?