使用新的 Net Core 3.0 Json 时忽略 属性 null

Ignore property when null using the new Net Core 3.0 Json

在 ASP.Net Core 2.2 中使用 JSON.Net 时,在序列化为 JSON:

时,当其值为 null 时,我能够忽略 属性
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public DateTime? Created { get; set; }

但是当使用内置于 JSON (System.Text.Json) 中的新 ASP.Net Core 3.0 时,我找不到等效的属性来忽略 属性 如果它的值为空。

我只能找到 JsonIgnore。

我是不是漏掉了什么?

查看官方迁移指南Migrate from ASP.NET Core 2.2 to 3.0

您的服务代码应如下所示:

services.AddMvc(c =>
{

})
.AddNewtonsoftJson(
    options =>
        {
            options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
            options.SerializerSettings.ContractResolver = new DefaultContractResolver();
            options.SerializerSettings.StringEscapeHandling = StringEscapeHandling.EscapeHtml;                      

            options.SerializerSettings.Error = (object sender, ErrorEventArgs args) =>
            {
               // handle error
            };
        }
    );

尽管它不符合 属性 也不是一个属性,但将它添加到您的启动应该会有所帮助。

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

我正在查看 .Net Core 3.1,它应该忽略空值

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

在 .NET 5 及更高版本中,设置 JsonSerializerOptions.DefaultIgnoreCondition to JsonIgnoreCondition.WhenWritingNull:

services.AddControllers().AddJsonOptions(options =>
{
    options.JsonSerializerOptions.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull;
});

请注意,以上内容并非根据 property/attribute,尽管有一个属性可能会有所帮助 JsonIgnoreAttribute

解决您的问题的另一种方法可能是 JsonConverterAttribute, information on how to write your own converter is here

如果您想要 属性 级别控制在 JSON 序列化期间忽略空值,对于 Net Core 3.1,您必须编写一个自定义转换器。有examples described in the Newtonsoft.Json migration documentation.

对于使用 Newtonsoft.Json 声明的功能来说,这是一个很大的麻烦。您可以通过 specifying as much in Startup.ConfigureServices().

指定使用 Newtonsoft.Json
services.AddControllers()
    .AddNewtonsoftJson();

如文档所述,您需要添加 Microsoft.AspNetCore.Mvc.NewtonsoftJson 包。

如果您仍在.net core 3.1 中使用Newtonsoft.Json,您需要如下配置。

services
   .AddControllers()
   .AddJsonOptions(options =>
   {
       options.JsonSerializerOptions.IgnoreNullValues = true;
   })
   .AddNewtonsoftJson(options =>
   {
       options.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore;
   });

这已在 .Net 5 上修复

[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]

查看下面的更新

https://github.com/dotnet/runtime/issues/41313

https://github.com/dotnet/runtime/issues/30687

如果您正在使用 System.Text.Json (.net 5.0) 并且您想要忽略所有 null 使用 WhenWritingNull 条件:

services.AddControllers().AddJsonOptions(a =>
     {
        a.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.Preserve;            
        a.JsonSerializerOptions.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull;
     });