首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用System.Text.Json忽略虚值

如何使用System.Text.Json忽略虚值
EN

Stack Overflow用户
提问于 2019-10-03 18:52:49
回答 1查看 9K关注 0票数 9

在我的Newtonsoft.Json核心3.0应用程序中,我将从System.Text.Json迁移到.NET。我在试图忽略虚假的价值观。

System.Text.Json中,我找到了忽略null值的选项:

代码语言:javascript
复制
JsonSerializerOptions.IgnoreNullValues = true;

但我无法在System.Text.Json中找到忽略虚值的选项。

有人知道如何用System.Text.Json来实现这一点吗?

或者,如果有人知道类似于Newtonsoft DefaultValueHandling = DefaultValueHandling.Ignore选项的话,那也太棒了。

EN

回答 1

Stack Overflow用户

发布于 2020-11-16 20:58:06

这是在.Net 5.0中实现的

支持忽略值类型默认值。

此版本引入了JsonIgnoreCondition enum:

/当在JsonSerializerOptions.DefaultIgnoreCondition上指定时,/确定何时忽略类型图中的属性和字段。/在JsonIgnoreAttribute.Condition上指定时,控制在序列化和反序列化过程中是否忽略/a属性。此选项/重写JsonSerializerOptions.DefaultIgnoreCondition上的设置。在序列化或反序列化期间,公共枚举JsonIgnoreCondition {/属性永远不会被忽略。在序列化和反序列化过程中,始终忽略and = 0,/ Property。总是= 1,/,如果值是默认值,则在序列化期间忽略该属性。/这适用于引用和值类型属性和字段。WhenWritingDefault = 2,/如果值是,则在序列化期间忽略该属性。/仅适用于引用类型属性和字段。WhenWritingNull = 3,}

具体来说,JsonIgnoreCondition.WhenWritingDefault将抑制false布尔值。它可以通过两种方式之一加以应用。首先,您可以使用JsonIgnoreAttribute.Condition直接将其应用于成员。

代码语言:javascript
复制
public class Model
{
    [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)]
    public bool Value { get; set; }
}

演示小提琴#1 这里

其次,您可以在JsonSerializerOptions.DefaultIgnoreCondition中设置它

指定一个条件,以确定在序列化或反序列化期间忽略默认值属性的时间。默认值是绝不可能

例如,给出以下模式:

代码语言:javascript
复制
public class Model
{
    public bool Value { get; set; }
}

您可以按以下方式序列化它,以跳过运行时中的false值序列化:

代码语言:javascript
复制
var options = new JsonSerializerOptions { DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingDefault };
var json = JsonSerializer.Serialize(model, options);

演示小提琴#2 这里

备注:

  1. JsonIgnoreCondition似乎有一些不准确之处。首先,他们声称WhenWritingDefault意味着 属性只有当它是null时才会被忽略。

但是,实际上,如果属性是default,则该属性将被忽略,如源代码中所述。

其次,他们声称WhenWritingNull

仅应用于引用类型属性和字段。

但是,测试表明它也适用于可空值类型成员。例如,鉴于这一模式:

公共类模型{公共bool?值{ get;set;}}

使用DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingDefault序列化时,当Value为null时,它会省略:

变量模型=新模型();//保留值null var options = new JsonSerializerOptions { DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingDefault };

演示小提琴#3 这里

  1. 设置JsonSerializerOptions.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingDefault适用于--所有值类型--,而不仅仅是bool。因此,如果您有任何doubleintDateTimedecimal (包括具有指定数字数(如decimal.Parse("0.0000"))的零值十进制)或其他值类型成员,则当值等于默认值时,它们将被省略。 似乎没有办法在全局跳过仅默认bool值成员的序列化,同时仍然序列化其他值类型的成员,这可以通过自定义契约解析器在Json.NET中完成。 演示小提琴#4 这里
  2. 在确定成员是否具有默认值时,使用值类型(即default(T))的默认值。与Json.NET不同,DefaultValueAttribute没有被考虑在内。 演示小提琴#5 这里
  3. 在使用.Net 5.0之前,您需要为包含的类型创建一个JsonConverter (即上面的示例中的Model ),并根据需要手动跳过或序列化每个成员。
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58225273

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档