.NET 8中Redis缓存与API输出的JsonIgnore差异化配置方案咨询
.NET 8下System.Text.Json实现序列化差异化配置的方案
针对你遇到的Redis缓存与API输出序列化规则不一致的问题,有两种最实用的解决思路:
1. 为不同场景创建独立的JsonSerializerOptions实例
这是最直接的方案,通过分别配置API输出和Redis缓存专用的序列化选项,精准控制各场景下的属性忽略规则。
实现步骤:
- 定义两个独立的
JsonSerializerOptions对象,分别对应API和Redis场景 - 针对API的配置,手动标记需要忽略的属性;Redis的配置保持默认或仅忽略必要属性
示例代码:
// API输出专用配置:忽略指定属性 public static readonly JsonSerializerOptions ApiJsonOptions = new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase, DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull }; // Redis缓存专用配置:仅忽略空值属性 public static readonly JsonSerializerOptions RedisJsonOptions = new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase, DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull }; // 初始化时为API配置添加属性忽略规则 var productTypeInfo = ApiJsonOptions.GetTypeInfo(typeof(Product)); productTypeInfo.Properties[nameof(Product.CreatedAt)].IsIgnored = true; productTypeInfo.Properties[nameof(Product.InternalId)].IsIgnored = true;
使用时直接传入对应配置:
// API返回时用ApiJsonOptions return Ok(JsonSerializer.Serialize(product, ApiJsonOptions)); // Redis缓存时用RedisJsonOptions await redisDb.StringSetAsync($"product:{id}", JsonSerializer.Serialize(product, RedisJsonOptions));
这种方式无需修改实体类特性,灵活度高,适合属性差异较小的场景。
2. 分离DTO(数据传输对象)
如果API与缓存的属性差异较大,或者需要严格隔离不同场景的数据结构,推荐为API输出单独定义DTO类。
实现步骤:
- 实体类保留所有属性,用于Redis缓存的序列化
- 为API输出创建对应的DTO类,仅包含需要返回给前端的属性
- 通过手动赋值或映射工具完成实体与DTO的转换
示例代码:
// 实体类:全属性,用于Redis缓存 public class Product { public int Id { get; set; } public string Name { get; set; } public decimal Price { get; set; } public DateTime CreatedAt { get; set; } public Guid InternalId { get; set; } } // API输出DTO:仅保留前端需要的属性 public class ProductApiDto { public int Id { get; set; } public string Name { get; set; } public decimal Price { get; set; } }
使用示例:
// Redis缓存直接存实体 await redisDb.StringSetAsync($"product:{id}", JsonSerializer.Serialize(product)); // API返回时转换为DTO var apiDto = new ProductApiDto { Id = product.Id, Name = product.Name, Price = product.Price }; return Ok(apiDto);
这种方案结构清晰,避免了序列化配置的复杂度,团队协作时更容易理解各场景的数据边界。
内容的提问来源于stack exchange,提问作者kevingoos
相关产品推荐
相关产品推荐

