36

在 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 时,如果其值为 null,我找不到忽略属性的等效属性。

我只能找到 JsonIgnore。

我错过了什么吗?

4

7 回答 7

24

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

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

请注意,以上不是每个属性/属性,尽管有一个属性可能有用JsonIgnoreAttribute

解决您的问题的替代方法可能是JsonConverterAttribute,有关如何编写自己的转换器的信息在这里

于 2020-01-31T14:18:44.437 回答
22

这已在 .Net 5 上修复

[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]

请参阅下面的更新

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

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

于 2021-04-15T19:18:47.783 回答
13

如果您希望在 JSON 序列化期间忽略空值的属性级别控制,对于 Net Core 3.1,您必须编写一个自定义转换器。Newtonsoft.Json 迁移文档中描述了一些示例

对于使用 Newtonsoft.Json 进行声明的功能来说,这是一个很大的麻烦。您可以通过在 Startup.ConfigureServices() 中指定尽可能多的内容来指定使用 Newtonsoft.Json 。

services.AddControllers()
    .AddNewtonsoftJson();

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

于 2020-05-21T16:52:51.200 回答
10

将此添加到您的初创公司应该会有所帮助,尽管它不是每个属性,也不是属性。

services.AddMvc()
        .AddJsonOptions(options =>{ options.JsonSerializerOptions.IgnoreNullValues = true; });
于 2019-12-10T10:18:59.440 回答
6

如果您仍在 .net core 3.1 中使用 Newtonsoft.Json,您希望进行如下配置。

services
   .AddControllers()
   .AddJsonOptions(options =>
   {
       options.JsonSerializerOptions.IgnoreNullValues = true;
   })
   .AddNewtonsoftJson(options =>
   {
       options.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore;
   });
于 2020-07-02T14:55:00.707 回答
2

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

services.AddControllers().AddJsonOptions(a =>
     {
        a.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.Preserve;            
        a.JsonSerializerOptions.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull;
     });
于 2021-11-04T13:00:54.800 回答
-3

请参阅官方迁移指南从 ASP.NET Core 2.2 迁移到 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
            };
        }
    );
于 2019-10-09T07:22:50.697 回答