如何让Swashbuckle生成不含时间的日期类型Swagger属性?
解决Swashbuckle识别自定义DateFormatConverter的问题
我完全懂你的困扰——用NSwag生成的Person类带了自定义的DateFormatConverter,但Swashbuckle生成Swagger契约时,还是把dateOfBirth标记成了date-time格式,而你只想让加了这个转换器的属性显示为date格式,不想全局修改所有DateTime类型。
下面是针对性的解决方案:
步骤1:创建自定义SchemaFilter
我们需要写一个ISchemaFilter实现,专门检查属性上的JsonConverterAttribute,只有当转换器是你的DateFormatConverter时,才修改Swagger schema的格式:
public class DateFormatSchemaFilter : ISchemaFilter { public void Apply(OpenApiSchema schema, SchemaFilterContext context) { // 确保当前处理的是属性 if (context.MemberInfo is PropertyInfo propertyInfo) { // 获取属性上的JsonConverter特性 var converterAttribute = propertyInfo.GetCustomAttribute<JsonConverterAttribute>(); // 判断是否使用了我们自定义的DateFormatConverter if (converterAttribute != null && converterAttribute.ConverterType == typeof(DateFormatConverter)) { // 将schema的格式改为date(对应yyyy-MM-dd的日期格式) schema.Format = "date"; } } } }
注意:如果你的
DateFormatConverter是internal内部类,反射可能无法访问它的类型信息,建议把它改成public,或者在判断时用类型的全名来匹配(比如converterAttribute.ConverterType.FullName == "你的命名空间.DateFormatConverter")。
步骤2:注册SchemaFilter到Swashbuckle
在你的Swagger配置代码里(.NET Core 3.1/5在Startup.cs,.NET 6+在Program.cs),添加这个过滤器:
.NET Core 3.1/5 示例
services.AddSwaggerGen(c => { // 注册自定义SchemaFilter c.SchemaFilter<DateFormatSchemaFilter>(); // 其他Swagger配置(比如文档信息、XML注释等) c.SwaggerDoc("v1", new OpenApiInfo { Title = "Your API", Version = "v1" }); });
.NET 6+ 示例
builder.Services.AddSwaggerGen(c => { c.SchemaFilter<DateFormatSchemaFilter>(); c.SwaggerDoc("v1", new OpenApiInfo { Title = "Your API", Version = "v1" }); });
效果验证
配置完成后,重新生成Swagger契约,Person的定义会变成你期望的样子:
"Person": { "dateOfBirth": { "format": "date", "type": "string" } }
这个方案只会影响标注了DateFormatConverter的属性,不会全局修改所有DateTime类型的schema,完美符合你的需求。
内容的提问来源于stack exchange,提问作者Johannes Brodwall
相关产品推荐
相关产品推荐

