.NET 9访问/openapi/v1.json触发JsonReaderException深度超限问题
解决.NET 9中OpenAPI端点JSON深度超出限制的问题
问题根源
你配置的Microsoft.AspNetCore.Http.Json.JsonOptions仅作用于ASP.NET Core的HTTP请求/响应JSON序列化流程,而Swagger生成OpenAPI文档时使用的是独立的Json序列化配置,因此该设置不会生效,仍会触发默认的64层深度限制。
解决方案
1. 配置Swagger专属的Json序列化选项
针对Swagger生成文档的过程,直接在SwaggerGenOptions中配置Json参数:
builder.Services.AddSwaggerGen(options => { // 配置Swagger使用的Json序列化规则 options.JsonSerializerOptions.MaxDepth = 12800; options.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles; options.JsonSerializerOptions.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull; });
2. 复用全局Json配置(可选)
若希望统一HTTP和Swagger的Json规则,可先定义全局配置再复用:
var globalJsonOptions = new JsonSerializerOptions { ReferenceHandler = ReferenceHandler.IgnoreCycles, MaxDepth = 12800, DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull }; // 配置HTTP Json选项 builder.Services.Configure<Microsoft.AspNetCore.Http.Json.JsonOptions>(options => { options.SerializerOptions.Merge(globalJsonOptions); }); // 让Swagger复用全局配置 builder.Services.AddSwaggerGen(options => { options.JsonSerializerOptions.Merge(globalJsonOptions); });
3. 优化模型结构
即使设置了深度限制,过度嵌套的模型仍可能引发问题,可尝试:
- 用
[SwaggerIgnore]标记OpenAPI文档中不需要展示的属性 - 为复杂模型创建扁平化的DTO,减少嵌套层级
- 检查是否存在隐性循环引用(如父模型包含子模型,子模型又反向引用父模型)
4. 验证Swagger包版本
确保使用的Swashbuckle.AspNetCore包版本兼容.NET 9(建议6.4.0及以上),避免版本不匹配导致配置失效。
内容的提问来源于stack exchange,提问作者bbqchickenrobot
相关产品推荐
相关产品推荐

