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

.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类型的示例格式,不影响全局文化设置:

  1. 定义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));
            }
        }
    }
}
  1. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 12:52:34