在我的Newtonsoft.Json核心3.0应用程序中,我将从System.Text.Json迁移到.NET。我在试图忽略虚假的价值观。
在System.Text.Json中,我找到了忽略null值的选项:
JsonSerializerOptions.IgnoreNullValues = true;但我无法在System.Text.Json中找到忽略虚值的选项。
有人知道如何用System.Text.Json来实现这一点吗?
或者,如果有人知道类似于Newtonsoft DefaultValueHandling = DefaultValueHandling.Ignore选项的话,那也太棒了。
发布于 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直接将其应用于成员。
public class Model
{
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)]
public bool Value { get; set; }
}演示小提琴#1 这里。
其次,您可以在JsonSerializerOptions.DefaultIgnoreCondition中设置它
指定一个条件,以确定在序列化或反序列化期间忽略默认值属性的时间。默认值是绝不可能。
例如,给出以下模式:
public class Model
{
public bool Value { get; set; }
}您可以按以下方式序列化它,以跳过运行时中的false值序列化:
var options = new JsonSerializerOptions { DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingDefault };
var json = JsonSerializer.Serialize(model, options);演示小提琴#2 这里。
备注:
JsonIgnoreCondition似乎有一些不准确之处。首先,他们声称WhenWritingDefault意味着
属性只有当它是null时才会被忽略。但是,实际上,如果属性是default,则该属性将被忽略,如源代码中所述。
其次,他们声称WhenWritingNull
仅应用于引用类型属性和字段。
但是,测试表明它也适用于可空值类型成员。例如,鉴于这一模式:
公共类模型{公共bool?值{ get;set;}}
使用DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingDefault序列化时,当Value为null时,它会省略:
变量模型=新模型();//保留值null var options = new JsonSerializerOptions { DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingDefault };
演示小提琴#3 这里。
JsonSerializerOptions.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingDefault适用于--所有值类型--,而不仅仅是bool。因此,如果您有任何double、int、DateTime、decimal (包括具有指定数字数(如decimal.Parse("0.0000"))的零值十进制)或其他值类型成员,则当值等于默认值时,它们将被省略。
似乎没有办法在全局跳过仅默认bool值成员的序列化,同时仍然序列化其他值类型的成员,这可以通过自定义契约解析器在Json.NET中完成。
演示小提琴#4 这里。default(T))的默认值。与Json.NET不同,DefaultValueAttribute没有被考虑在内。
演示小提琴#5 这里。JsonConverter (即上面的示例中的Model ),并根据需要手动跳过或序列化每个成员。https://stackoverflow.com/questions/58225273
复制相似问题