如何修改自动生成NuGet包中的EmitDefaultValue配置?
解决Swashbuckle生成NuGet包时int属性0值无法序列化的问题
针对你遇到的「默认值为-1,但生成的代码中EmitDefaultValue=false导致0值被忽略」的问题,不用全局修改所有属性,只需要通过自定义特性+局部Schema过滤器就能精准处理少数目标属性,步骤如下:
1. 定义自定义标记特性
创建一个用来标记需要强制保留默认值的属性特性:
[AttributeUsage(AttributeTargets.Property)] public class ForceEmitDefaultValueAttribute : Attribute { }
2. 实现Schema过滤器
写一个轻量的过滤器,仅处理带有上述特性的属性:
using Microsoft.OpenApi.Models; using Swashbuckle.AspNetCore.SwaggerGen; using System.Reflection; public class ForceEmitDefaultValueFilter : ISchemaFilter { public void Apply(OpenApiSchema schema, SchemaFilterContext context) { var property = context.MemberInfo as PropertyInfo; if (property?.GetCustomAttribute<ForceEmitDefaultValueAttribute>() != null) { // 明确设置业务默认值为-1 schema.Default = new OpenApiInteger(-1); // 强制开启EmitDefaultValue,确保0值会被序列化 schema.EmitDefaultValue = true; // 可选:若需要允许属性为null,可添加 schema.Nullable = true; } } }
3. 注册过滤器到Swagger配置
在你的Swagger服务配置中添加这个过滤器:
builder.Services.AddSwaggerGen(c => { // 保留你原有的Swagger配置(如文档信息、注释加载等) c.SchemaFilter<ForceEmitDefaultValueFilter>(); });
4. 标记目标属性
在需要修正的属性上添加自定义特性:
[Range(-1, int.MaxValue)] [DefaultValue(-1)] [DataMember(EmitDefaultValue = true)] [ForceEmitDefaultValue] // 新增这个标记 public int SomeNumber { get; set; } = -1;
补充说明
Swashbuckle 6.x版本在生成OpenAPI Schema时,会优先根据属性的类型默认值(int类型为0)推断序列化规则,即便你设置了DataMember(EmitDefaultValue = true),它也可能自动覆盖为false。通过自定义过滤器,我们可以手动覆盖这个推断逻辑,精准指定业务默认值和序列化规则。
内容的提问来源于stack exchange,提问作者MMirbach
相关产品推荐
相关产品推荐

