前言
通常,在進行 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】,邀你加入技術交流群