前言
通常,在进行 JSON 序列化或反序列化时,如果要忽略某个属性,我们会使用 [JsonIgnore] 特性:
public class User
{
public int Id { get; set; }
[JsonIgnore]
public string Name { get; set; }
}
var user = new User { Id = 1, Name = "MyIO" };
Console.WriteLine(JsonSerializer.Serialize(user));
//输出
{"Id":1}
偶然发现, [JsonIgnore] 特性还可以指定 Condition
属性:
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
public string Name { get; set; }
那么它有什么作用呢?
JsonIgnoreCondition 枚举
可以通过设置 [JsonIgnore] 特性的 Condition 属性来指定条件排除。Condition 属性对应的 JsonIgnoreCondition 枚举提供下列选项:
Always - 始终忽略属性。如果未指定 Condition,则默认此选项
Never - 忽略全局设置,始终序列化和反序列化属性
public class A
{
public string Name { get; } = "MyIO";
}
public class B
{
[JsonIgnore( Condition = JsonIgnoreCondition.Never)]
public string Name { get; } = "MyIO";
}
//全局设置为忽略只读属性
var options = new JsonSerializerOptions
{
IgnoreReadOnlyProperties = true
};
Console.WriteLine(JsonSerializer.Serialize(new A(), options));
Console.WriteLine(JsonSerializer.Serialize(new B(), options));
//输出
//A 中的 Name 不会序列化,而 B 中的 Name 还是会序列化
{}
{"Name":"B"}
WhenWritingDefault - 如果属性值是该属性数据类型的默认值,则在序列化中忽略属性
public class User
{
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)]
public int Id { get; set; }
public string Name { get; set; }
}
var user = new User { Id = 0, Name = "" };
Console.WriteLine(JsonSerializer.Serialize(user));
//输出
{"Name":""}
WhenWritingNull - 如果属性值是 null,则在序列化中忽略属性
public class User
{
public int Id { get; set; }
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
public string Name { get; set; }
}
var user = new User { Id = 1, Name = null };
Console.WriteLine(JsonSerializer.Serialize(user));
//输出
{"Id":1}
结论
我们还可以使用 JsonSerializerOptions 全局设置忽略属性的方式:
DefaultIgnoreCondition - 默认的JsonIgnoreCondition,默认值为 Never
IgnoreReadOnlyProperties - 忽略所有只读属性
添加微信号【MyIO666】,邀你加入技术交流群