马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
总目录
一、JsonIgnoreCondition 枚举值详解
JsonIgnoreCondition 是一个枚举范例,用于控制序列化或反序列化时如何忽略属性或字段。其枚举值及其寄义如下:
枚举值作用Always始终忽略该成员(无论值是什么)。Never从不忽略该成员(即使全局设置了 DefaultIgnoreCondition)。WhenWritingDefault当属性值为 默认值 时忽略(如 int 的默认值 0、string 的 null)。WhenWritingNull当属性值为 null 时忽略(仅对可为 null 的范例见效)。 二、焦点使用场景
1. 通过 [JsonIgnore] 特性控制单个成员
使用 [JsonIgnore(Condition = ...)] 特性可对单个属性或字段的忽略举动举行细粒度控制。
1)始终忽略属性(Always)
- public class User
- {
- public string Name { get; set; }
- [JsonIgnore(Condition = JsonIgnoreCondition.Always)]
- public string Password { get; set; } // 始终忽略
- }
- class Program
- {
- static void Main()
- {
- var user = new User { Name = "Alice", Password = "123" };
- string json = JsonSerializer.Serialize(user);
- Console.WriteLine(json);
- // 输出:{"Name":"Alice"}
- }
- }
复制代码 2)仅在值为 null 时忽略(WhenWritingNull)
- public class Product
- {
- public string Name { get; set; }
- [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
- public string Description { get; set; } // 值为 null 时忽略
- }
- class Program
- {
- static void Main()
- {
- // 场景 1:Description 为 null
- var product1 = new Product { Name = "Book", Description = null };
- string json1 = JsonSerializer.Serialize(product1);
- Console.WriteLine(json1);
- // 输出:{"Name":"Book"}
- // 场景 2:Description 有值
- var product2 = new Product { Name = "Pen", Description = "Writing tool" };
- string json2 = JsonSerializer.Serialize(product2);
- Console.WriteLine(json2);
- // 输出:{"Name":"Pen","Description":"Writing tool"}
- }
- }
复制代码 3)仅在默认值时忽略(WhenWritingDefault)
- public class Settings
- {
- public int MaxConnections { get; set; } // 默认值为 0
- [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)]
- public int Timeout { get; set; } // 默认值为 0
- }
- // 场景 1:Timeout 为默认值 0
- var settings1 = new Settings { MaxConnections = 10 };
- string json1 = JsonSerializer.Serialize(settings1);
- // 输出:{"MaxConnections":10}(Timeout 被忽略)
- // 场景 2:Timeout 被显式赋值
- var settings2 = new Settings { MaxConnections = 10, Timeout = 30 };
- string json2 = JsonSerializer.Serialize(settings2);
- // 输出:{"MaxConnections":10,"Timeout":30}
复制代码 2. 全局设置 DefaultIgnoreCondition
通过 JsonSerializerOptions.DefaultIgnoreCondition 可为所有未显式标志的成员设置默认忽略规则。
通过设置 JsonSerializerOptions 类中的 DefaultIgnoreCondition 属性 来设置全局忽略规则
1)全局忽略默认值
- public class Data
- {
- public string Name { get; set; } // 默认值为 null
- public int Count { get; set; } // 默认值为 0
- }
- var options = new JsonSerializerOptions
- {
- DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingDefault // 全局设置
- };
- // 场景:对象未初始化
- var data = new Data();
- string json = JsonSerializer.Serialize(data, options);
- // 输出:{}(Name 和 Count 均被忽略,因为它们是默认值)
- // 场景:显式赋值
- var data2 = new Data { Name = "Test", Count = 5 };
- string json2 = JsonSerializer.Serialize(data2, options);
- // 输出:{"Name":"Test","Count":5}
复制代码 2)全局忽略 null 值
- public class User
- {
- public int Id { get; set; }
- public string Name { get; set; }
- public string Password { get; set; }
- }
- class Program
- {
- static void Main()
- {
- var options = new JsonSerializerOptions
- {
- DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull // 全局设置
- };
- // 场景:对象未初始化
- var user = new User();
- string json = JsonSerializer.Serialize(user, options);
- Console.WriteLine(json);
- // 输出:{"Id":0}
- // 场景:显式赋值
- var user2 = new User { Id = 1, Name = "Test" };
- string json2 = JsonSerializer.Serialize(user2, options);
- Console.WriteLine(json2);
- // 输出:{"Id":1,"Name":"Test"}
- }
- }
复制代码 3)全局忽略与 [JsonIgnore] 特性 混合设置
- public class User
- {
- public int Id { get; set; }
- [JsonIgnore(Condition = JsonIgnoreCondition.Never)]// 始终忽略
- public string Name { get; set; }
- [JsonIgnore(Condition = JsonIgnoreCondition.Never)]// 始终忽略
- public string Password { get; set; }
- }
- class Program
- {
- static void Main()
- {
- var options = new JsonSerializerOptions
- {
- DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingDefault // 全局设置
- };
- // 场景:对象未初始化
- var user = new User();
- string json = JsonSerializer.Serialize(user, options);
- Console.WriteLine(json);
- // 输出:{"Name":null,"Password":null}
- // 场景:显式赋值
- var user2 = new User { Id=1, Name = "Test"};
- string json2 = JsonSerializer.Serialize(user2, options);
- Console.WriteLine(json2);
- // 输出:{"Id":1,"Name":"Test","Password":null}
- }
- }
复制代码 4)优先级规则
- 局部优先级:[JsonIgnore(Condition = ...)] 的设置会覆盖全局 DefaultIgnoreCondition。
- 组合条件:多个条件(如 WhenWritingNull 和 WhenWritingDefault)可同时见效。
三、扩展
1. 忽略只读属性
通过 JsonSerializerOptions.IgnoreReadOnlyProperties 可全局忽略只读属性:
- public class Book
- {
- public string Title { get; set; }
- public int Pages { get; private set; } = 300; // 只读属性
- }
- class Program
- {
- static void Main()
- {
- var options = new JsonSerializerOptions
- {
- IgnoreReadOnlyProperties = true // 忽略只读属性
- };
- var book = new Book { Title = "C# in Depth" };
- string json = JsonSerializer.Serialize(book, options);
- Console.WriteLine(json);
- // 输出:{"Title":"C# in Depth"}(Pages 被忽略)
- }
- }
复制代码 2. 与 JsonInclude 的共同
若需序列化非公共属性或字段,需团结 [JsonInclude] 特性:
- public class User
- {
- public int Id { get; set; }
- public string Name { get; set; }
- public string Password { get; set; }
- [JsonInclude]
- public int _age;
- }
- class Program
- {
- static void Main()
- {
- var user = new User { Id = 1, Name = "Jack", Password = "121", _age = 12 };
-
- string json = JsonSerializer.Serialize(user);
- Console.WriteLine(json);
- // 输出:{"Id":1,"Name":"Jack","Password":"121","_age":12}
- }
- }
复制代码 3. 同时忽略默认值和 null?
1)指定属性
- public class User
- {
- public int Id { get; set; }
- public string Name { get; set; }
- [JsonIgnore(Condition =JsonIgnoreCondition.WhenWritingDefault| JsonIgnoreCondition.WhenWritingNull)]
- public string Password { get; set; }
- }
复制代码 2)全局设置
- var options = new JsonSerializerOptions
- {
- DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull | JsonIgnoreCondition.WhenWritingDefault
- };
复制代码 四、实际应用
- 场景 1:在 API 响应中,某些字段大概需要根据环境动态显示/潜伏(比方调试模式下包罗 Age 属性)。
- 场景 2:处置惩罚第三方 JSON 数据时,临时禁用 [JsonIgnore] 标志以兼容旧版接口。
通过机动配置 DefaultIgnoreCondition,可以精准控制序列化的输出内容,提升代码的机动性和可维护性。
结语
回到目录页:C#/.NET 知识汇总
希望以上内容可以资助到各人,如文中有不对之处,还请批评指正。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |