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

升级Swashbuckle后SwaggerGen不识别Newtonsoft JsonProperty属性

问题分析与解决方案

你遇到的核心问题在于Swagger配置的顺序错误、JSON序列化配置冲突,以及枚举作为字典键时的Schema生成异常,具体修复步骤如下:


1. 修正AddSwaggerGenNewtonsoftSupport的调用位置

你当前把services.AddSwaggerGenNewtonsoftSupport()放在了ConfigureSwaggerGen的委托内部,这是错误的——这个方法必须紧跟在AddSwaggerGen之后直接调用,不能嵌套在配置委托里。

修改后的SwaggerConfig.cs:

public static void AddSwaggerPage(this IServiceCollection services)
{
    services.AddSwaggerGen(options =>
    {
        options.SwaggerDoc("v1", new OpenApiInfo
        {
            Version = "v1",
            Title = "你的API标题",
            Description = "API描述文本"
        });
        // 保留你的认证相关代码...
    });

    // 关键:必须在AddSwaggerGen之后直接调用,不能放在ConfigureSwaggerGen内部
    services.AddSwaggerGenNewtonsoftSupport();
}

2. 清理重复的JSON序列化配置

你同时混合了Newtonsoft.Json和System.Text.Json的配置,这会导致Swagger无法正确识别Newtonsoft的属性标签。需统一保留Newtonsoft.Json的配置,移除System.Text.Json相关的AddJsonOptions。

修改后的Startup.cs配置部分:

var builder = services.AddMvcCore(x => {
    x.EnableEndpointRouting = false;
});

// 仅保留Newtonsoft.Json的统一配置
builder.AddNewtonsoftJson(x => {
    x.AllowInputFormatterExceptionMessages = false;

    // 枚举序列化为字符串
    x.SerializerSettings.Converters.Add(new StringEnumConverter());
    // 忽略空值序列化
    x.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
    x.SerializerSettings.MissingMemberHandling = MissingMemberHandling.Ignore;
});

// 无需重复AddControllers().AddNewtonsoftJson(),MvcCore已配置完成
services.AddControllers();

services.AddSwaggerPage();

3. 解决枚举作为字典键导致的NullReferenceException

GetThingSettings中的Dictionary<ThingEnum, ThingEnabled>会触发Swagger Schema生成异常,需添加自定义Schema过滤器修正枚举键的处理逻辑:

第一步:创建Schema过滤器

public class EnumDictionaryKeySchemaFilter : ISchemaFilter
{
    public void Apply(OpenApiSchema schema, SchemaFilterContext context)
    {
        if (context.Type.IsGenericType && context.Type.GetGenericTypeDefinition() == typeof(Dictionary<,>))
        {
            var keyType = context.Type.GetGenericArguments()[0];
            if (keyType.IsEnum)
            {
                // 将字典键的类型修正为字符串(枚举的文本值)
                schema.Type = "object";
                schema.AdditionalProperties = new OpenApiSchema
                {
                    Reference = schema.AdditionalProperties?.Reference ?? new OpenApiReference
                    {
                        Type = ReferenceType.Schema,
                        Id = context.Type.GetGenericArguments()[1].Name
                    }
                };
                schema.Properties = null;
            }
        }
    }
}

第二步:在Swagger配置中注册过滤器

回到SwaggerConfig.cs的AddSwaggerGen委托内添加:

services.AddSwaggerGen(options =>
{
    // ...其他配置
    options.SchemaFilter<EnumDictionaryKeySchemaFilter>();
});

验证效果

完成上述修改后,重新启动项目:

  • [JsonProperty(PropertyName = "_etag")]会正确在swagger.json中显示为_etag
  • 访问swagger.json不会再出现500空引用错误

内容的提问来源于stack exchange,提问作者PotatoEngineer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 03:07:02