C# System.Text.Json 中 JsonIgnoreCondition 使用详解

打印 上一主题 下一主题

主题 1799|帖子 1799|积分 5397

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
总目录


一、JsonIgnoreCondition 枚举值详解

JsonIgnoreCondition 是一个枚举范例,用于控制序列化或反序列化时如何忽略属性或字段。其枚举值及其寄义如下:
枚举值作用Always始终忽略该成员(无论值是什么)。Never从不忽略该成员(即使全局设置了 DefaultIgnoreCondition)。WhenWritingDefault当属性值为 默认值 时忽略(如 int 的默认值 0、string 的 null)。WhenWritingNull当属性值为 null 时忽略(仅对可为 null 的范例见效)。 二、焦点使用场景

1. 通过 [JsonIgnore] 特性控制单个成员

使用 [JsonIgnore(Condition = ...)] 特性可对单个属性或字段的忽略举动举行细粒度控制。
1)始终忽略属性(Always)

  1. public class User
  2. {
  3.     public string Name { get; set; }
  4.     [JsonIgnore(Condition = JsonIgnoreCondition.Always)]
  5.     public string Password { get; set; } // 始终忽略
  6. }
  7. class Program
  8. {
  9.     static void Main()
  10.     {
  11.         var user = new User { Name = "Alice", Password = "123" };
  12.         string json = JsonSerializer.Serialize(user);
  13.         Console.WriteLine(json);
  14.         // 输出:{"Name":"Alice"}
  15.     }
  16. }
复制代码
2)仅在值为 null 时忽略(WhenWritingNull)

  1. public class Product
  2. {
  3.     public string Name { get; set; }
  4.     [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
  5.     public string Description { get; set; } // 值为 null 时忽略
  6. }
  7. class Program
  8. {
  9.     static void Main()
  10.     {
  11.         // 场景 1:Description 为 null
  12.         var product1 = new Product { Name = "Book", Description = null };
  13.         string json1 = JsonSerializer.Serialize(product1);
  14.         Console.WriteLine(json1);
  15.         // 输出:{"Name":"Book"}
  16.         // 场景 2:Description 有值
  17.         var product2 = new Product { Name = "Pen", Description = "Writing tool" };
  18.         string json2 = JsonSerializer.Serialize(product2);
  19.         Console.WriteLine(json2);
  20.         // 输出:{"Name":"Pen","Description":"Writing tool"}
  21.     }
  22. }
复制代码
3)仅在默认值时忽略(WhenWritingDefault)

  1. public class Settings
  2. {
  3.     public int MaxConnections { get; set; } // 默认值为 0
  4.     [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)]
  5.     public int Timeout { get; set; } // 默认值为 0
  6. }
  7. // 场景 1:Timeout 为默认值 0
  8. var settings1 = new Settings { MaxConnections = 10 };
  9. string json1 = JsonSerializer.Serialize(settings1);
  10. // 输出:{"MaxConnections":10}(Timeout 被忽略)
  11. // 场景 2:Timeout 被显式赋值
  12. var settings2 = new Settings { MaxConnections = 10, Timeout = 30 };
  13. string json2 = JsonSerializer.Serialize(settings2);
  14. // 输出:{"MaxConnections":10,"Timeout":30}
复制代码
2. 全局设置 DefaultIgnoreCondition

通过 JsonSerializerOptions.DefaultIgnoreCondition 可为所有未显式标志的成员设置默认忽略规则。
   通过设置 JsonSerializerOptions 类中的 DefaultIgnoreCondition 属性 来设置全局忽略规则
  1)全局忽略默认值

  1. public class Data
  2. {
  3.     public string Name { get; set; } // 默认值为 null
  4.     public int Count { get; set; }   // 默认值为 0
  5. }
  6. var options = new JsonSerializerOptions
  7. {
  8.     DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingDefault // 全局设置
  9. };
  10. // 场景:对象未初始化
  11. var data = new Data();
  12. string json = JsonSerializer.Serialize(data, options);
  13. // 输出:{}(Name 和 Count 均被忽略,因为它们是默认值)
  14. // 场景:显式赋值
  15. var data2 = new Data { Name = "Test", Count = 5 };
  16. string json2 = JsonSerializer.Serialize(data2, options);
  17. // 输出:{"Name":"Test","Count":5}
复制代码
2)全局忽略 null 值

  1. public class User
  2. {
  3.     public int Id { get; set; }
  4.     public string Name { get; set; }
  5.     public string Password { get; set; }
  6. }
  7. class Program
  8. {
  9.     static void Main()
  10.     {
  11.         var options = new JsonSerializerOptions
  12.         {
  13.             DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull // 全局设置
  14.         };
  15.         // 场景:对象未初始化
  16.         var user = new User();
  17.         string json = JsonSerializer.Serialize(user, options);
  18.         Console.WriteLine(json);
  19.         // 输出:{"Id":0}
  20.         // 场景:显式赋值
  21.         var user2 = new User { Id = 1, Name = "Test" };
  22.         string json2 = JsonSerializer.Serialize(user2, options);
  23.         Console.WriteLine(json2);
  24.         // 输出:{"Id":1,"Name":"Test"}
  25.     }
  26. }
复制代码
3)全局忽略与 [JsonIgnore] 特性 混合设置

  1. public class User
  2. {
  3.     public int Id { get; set; }
  4.     [JsonIgnore(Condition = JsonIgnoreCondition.Never)]// 始终忽略
  5.     public string Name { get; set; }
  6.     [JsonIgnore(Condition = JsonIgnoreCondition.Never)]// 始终忽略
  7.     public string Password { get; set; }
  8. }
  9. class Program
  10. {
  11.     static void Main()
  12.     {
  13.         var options = new JsonSerializerOptions
  14.         {
  15.             DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingDefault // 全局设置
  16.         };
  17.         // 场景:对象未初始化
  18.         var user = new User();
  19.         string json = JsonSerializer.Serialize(user, options);
  20.         Console.WriteLine(json);
  21.         // 输出:{"Name":null,"Password":null}
  22.         // 场景:显式赋值
  23.         var user2 = new User { Id=1, Name = "Test"};
  24.         string json2 = JsonSerializer.Serialize(user2, options);
  25.         Console.WriteLine(json2);
  26.         // 输出:{"Id":1,"Name":"Test","Password":null}
  27.     }
  28. }
复制代码
4)优先级规则



  • 局部优先级:[JsonIgnore(Condition = ...)] 的设置会覆盖全局 DefaultIgnoreCondition。
  • 组合条件:多个条件(如 WhenWritingNull 和 WhenWritingDefault)可同时见效。
三、扩展

1. 忽略只读属性

通过 JsonSerializerOptions.IgnoreReadOnlyProperties 可全局忽略只读属性:
  1. public class Book
  2. {
  3.     public string Title { get; set; }
  4.     public int Pages { get; private set; } = 300; // 只读属性
  5. }
  6. class Program
  7. {
  8.     static void Main()
  9.     {
  10.         var options = new JsonSerializerOptions
  11.         {
  12.             IgnoreReadOnlyProperties = true // 忽略只读属性
  13.         };
  14.         var book = new Book { Title = "C# in Depth" };
  15.         string json = JsonSerializer.Serialize(book, options);
  16.         Console.WriteLine(json);
  17.         // 输出:{"Title":"C# in Depth"}(Pages 被忽略)
  18.     }
  19. }
复制代码
2. 与 JsonInclude 的共同

若需序列化非公共属性或字段,需团结 [JsonInclude] 特性:
  1. public class User
  2. {
  3.     public int Id { get; set; }
  4.     public string Name { get; set; }
  5.     public string Password { get; set; }
  6.     [JsonInclude]
  7.     public int _age;
  8. }
  9. class Program
  10. {
  11.     static void Main()
  12.     {
  13.         var user = new User { Id = 1, Name = "Jack", Password = "121", _age = 12 };      
  14.         
  15.         string json = JsonSerializer.Serialize(user);
  16.         Console.WriteLine(json);
  17.         // 输出:{"Id":1,"Name":"Jack","Password":"121","_age":12}
  18.     }
  19. }
复制代码
3. 同时忽略默认值和 null?

1)指定属性

  1. public class User
  2. {
  3.     public int Id { get; set; }
  4.     public string Name { get; set; }
  5.     [JsonIgnore(Condition =JsonIgnoreCondition.WhenWritingDefault| JsonIgnoreCondition.WhenWritingNull)]
  6.     public string Password { get; set; }
  7. }
复制代码
2)全局设置

  1. var options = new JsonSerializerOptions
  2. {
  3.     DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull | JsonIgnoreCondition.WhenWritingDefault
  4. };
复制代码
四、实际应用



  • 场景 1:在 API 响应中,某些字段大概需要根据环境动态显示/潜伏(比方调试模式下包罗 Age 属性)。
  • 场景 2:处置惩罚第三方 JSON 数据时,临时禁用 [JsonIgnore] 标志以兼容旧版接口。
通过机动配置 DefaultIgnoreCondition,可以精准控制序列化的输出内容,提升代码的机动性和可维护性。

结语

回到目录页:C#/.NET 知识汇总
希望以上内容可以资助到各人,如文中有不对之处,还请批评指正。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

商道如狼道

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表