.NET 6中Swashbuckle.AspNetCore生成Swagger小数显示逗号的问题求助
解决Swashbuckle.AspNetCore生成Swagger时Decimal示例小数分隔符错误问题
问题根源是当前线程的区域设置(如部分欧洲地区用逗号作为小数分隔符),导致Swashbuckle序列化decimal类型的示例时使用了逗号,违反JSON语法规范。以下是几种可行的解决办法:
方案1:全局设置不变文化
在Program.cs最开头添加代码,强制应用程序使用不变文化(以点作为小数分隔符):
using System.Globalization; // 全局设置线程文化为不变文化 CultureInfo.DefaultThreadCurrentCulture = CultureInfo.InvariantCulture; CultureInfo.DefaultThreadCurrentUICulture = CultureInfo.InvariantCulture; var builder = WebApplication.CreateBuilder(args); // 后续服务配置代码...
优点:实现简单,一劳永逸解决所有文化相关的序列化问题;缺点:会影响应用中其他依赖区域设置的功能(如前端显示格式)。
方案2:自定义SchemaFilter精准处理Decimal示例
创建SchemaFilter仅修正Swagger中decimal类型的示例格式,不影响全局文化设置:
- 定义SchemaFilter类:
using Microsoft.OpenApi.Models; using Swashbuckle.AspNetCore.SwaggerGen; using System.Globalization; public class DecimalExampleSchemaFilter : ISchemaFilter { public void Apply(OpenApiSchema schema, SchemaFilterContext context) { // 仅处理decimal类型且存在示例的字段 if (context.Type == typeof(decimal) && schema.Example != null) { // 用不变文化解析并重新生成示例值 if (decimal.TryParse(schema.Example.ToString(), NumberStyles.Any, CultureInfo.InvariantCulture, out var decimalValue)) { schema.Example = OpenApiAnyFactory.CreateFromJson(decimalValue.ToString(CultureInfo.InvariantCulture)); } } } }
- 在Swagger配置中注册该Filter:
builder.Services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "你的API名称", Version = "v1" }); // 注册自定义SchemaFilter c.SchemaFilter<DecimalExampleSchemaFilter>(); });
优点:精准控制Swagger示例格式,不影响应用其他部分;缺点:需额外编写Filter代码。
方案3:直接映射Decimal类型的Swagger Schema
在Swagger配置中指定decimal类型的Schema模板,强制使用不变文化的示例格式:
builder.Services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "你的API名称", Version = "v1" }); // 自定义decimal类型的Swagger Schema c.MapType<decimal>(() => new OpenApiSchema { Type = "number", Format = "decimal", // 默认示例用0,实际会被XML注释中的example覆盖,序列化时按不变文化处理 Example = new OpenApiDecimal(0m) }); });
优点:无需额外Filter,直接通过类型映射修正格式;缺点:需确保所有decimal字段的示例都会按此规则序列化。
内容的提问来源于stack exchange,提问作者Enrico
相关产品推荐
相关产品推荐

