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

如何修改自动生成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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 13:45:07