You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 13:02:09