System.Text.Json中的哪个选项相当于Newtonsoft.Json中的DefaultValueHandling = DefaultValueHandling.Ignore?

9

我正在将.NET Core 3.0应用程序中的Newtonsoft.Json迁移到System.Text.Json

如何使用System.Text.Json实现与我在.NET Core 2.2应用程序中使用Newtonsoft.Json配置为DefaultValueHandling = DefaultValueHandling.Ignore相同的行为? 您可以在此处找到有关DefaultValueHandling选项的描述.


您是否需要在确定属性是否具有默认值时遵守 System.ComponentModel.DefaultValueAttribute?如果不需要,请参阅与此相关的问题 如何使用 System.Text.Json 忽略 false 值此答案 - dbc
4个回答

2

我认为你无法轻松地做到这一点。你可以使用JsonSerializerOptions类的IgnoreVullValues属性轻松地忽略null值,但这只会忽略null值,并使用默认值序列化整数、布尔值等。

你可以在这里找到更多关于JsonSerializerOptions类的信息。


感谢@byczu的回答!恐怕你是对的。我可能需要切换回Newtonsoft.Json - stevo

2
请尝试使用我编写的库,它是System.Text.Json的扩展,为缺失的功能提供支持: https://github.com/dahomey-technologies/Dahomey.Json
您将找到忽略默认值的支持:
using Dahomey.Json;
using Dahomey.Json.Attributes;
using System.Text.Json;

public class ObjectWithDefaultValue
{
    [JsonIgnoreIfDefault]
    [DefaultValue(12)]
    public int Id { get; set; }

    [JsonIgnoreIfDefault]
    [DefaultValue("foo")]
    public string FirstName { get; set; }

    [JsonIgnoreIfDefault]
    [DefaultValue("foo")]
    public string LastName { get; set; }

    [JsonIgnoreIfDefault]
    [DefaultValue(12)]
    public int Age { get; set; }
}

通过调用命名空间Dahomey.Json中定义的扩展方法SetupExtensions在JsonSerializerOptions上设置json扩展。然后使用常规的System.Text.Json API序列化您的类:

public void Test()
{
    JsonSerializerOptions options = new JsonSerializerOptions();
    options.SetupExtensions();

    ObjectWithDefaultValue obj = new ObjectWithDefaultValue
    {
        Id = 13,
        FirstName = "foo",
        LastName = "bar",
        Age = 12
    };

    string json = JsonSerializer.Serialize(obj, options); // {"Id":13,"LastName":"bar"}
}

2
我认为这可以有所帮助。
services.AddMvc().AddJsonOptions(options => options.JsonSerializerOptions.IgnoreNullValues = true);

谢谢@Gökten Karadağ!这确实有帮助,但你仍然会得到所有的假值,例如。 - stevo

0

有一个建议的 API 建议#42635,用于忽略默认值,已经添加到 .NET Core 5.0 发布中,该版本将于 2020 年 11 月发布。目前,Newtonsoft 是唯一值得使用的支持解决此特定问题的解决方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接