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

zyfwsgd6  于 2023-04-22  发布在  其他
关注(0)|答案(9)|浏览(277)

当在ASP.NET Core 2.2中使用JSON.Net时,我能够在序列化为JSON时忽略值为null的属性:

[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public DateTime? Created { get; set; }

但是当使用新的ASP.NetCore3.0内置JSON(System.Text.JSON)时,我找不到一个等效的属性来忽略值为null的属性。
我只能找到JsonIgnore。
我错过什么了吗?

siotufzp

siotufzp1#

我看到的是.NetCore3.1,它应该忽略空值

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

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

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

注意,上面的不是每个属性/属性,尽管有一个属性可能是有用的JsonIgnoreAttribute
另一种解决问题的方法是JsonConverterAttribute,关于如何编写自己的转换器的信息在这里

8hhllhi2

8hhllhi22#

这个问题在.Net 5上得到了解决

[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]

查看下面的更新
https://github.com/dotnet/runtime/issues/41313
https://github.com/dotnet/runtime/issues/30687

qxgroojn

qxgroojn3#

如果你想在JSON序列化过程中忽略null值的属性级控制,对于Net Core 3.1,你必须编写一个自定义转换器。在Newtonsoft.Json migration documentation中有一些例子。
这对于使用Newtonsoft.Json的声明性功能来说是一个很大的麻烦。您可以通过在Startup.ConfigureServices()中指定尽可能多的内容来指定使用Newtonsoft.Json。

services.AddControllers()
    .AddNewtonsoftJson();

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

9ceoxa92

9ceoxa924#

将其添加到启动中应该会有所帮助,尽管它不是每个属性,也不是一个属性。

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

9avjhtql5#

如果你还在.net core 3.1中使用Newtonsoft.json,你需要像下面这样配置。

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

lc8prwob6#

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

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

2uluyalo7#

TL&DR:DotNet 6中NullValueHandling已弃用,改用DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull

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

m2xkgtsf8#

如果您使用的是.Net core 6和System.Text.Json,请在program.cs中添加此更改

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

// if you want to remove $Id (metadata) from the response, add the below line
options.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles;
});
kdfy810k

kdfy810k9#

请参阅官方迁移指南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
            };
        }
    );

相关问题