升级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
相关产品推荐
相关产品推荐

