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

.NET Core中如何让Swagger显示DataMember指定的名称

解决Swagger请求体显示DataMember指定名称的问题

针对你遇到的Swagger显示属性名而非DataMember指定名称的问题,分两种常见场景给出解决方案:

场景1:使用Newtonsoft.Json(Json.NET)序列化

如果你的项目使用Newtonsoft.Json作为默认序列化器,只需配置Swagger遵循DataContract的序列化规则:

  1. 首先确保安装了Swashbuckle.AspNetCore.Newtonsoft NuGet包
  2. 在Program.cs(或Startup.cs)中配置控制器和Swagger:
// 配置控制器使用NewtonsoftJson,并启用DataContract解析
builder.Services.AddControllers()
    .AddNewtonsoftJson(options =>
    {
        options.SerializerSettings.ContractResolver = new DataContractResolver();
    });

// 配置Swagger
builder.Services.AddSwaggerGen(c =>
{
    // 这里可以添加你的Swagger文档信息,比如标题、版本等
    c.SwaggerDoc("v1", new OpenApiInfo { Title = "Your API", Version = "v1" });
});

这样配置后,Swagger会自动读取DataMember特性的Name值,在请求体中显示my_test而非myTest。

场景2:使用System.Text.Json序列化

如果项目使用默认的System.Text.Json,由于它原生不支持DataContract特性,需要自定义SchemaFilter来修改Swagger的Schema:

  1. 创建一个自定义的SchemaFilter类:
using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerGen;
using System.Reflection;
using System.Runtime.Serialization;

public class DataMemberSchemaFilter : ISchemaFilter
{
    public void Apply(OpenApiSchema schema, SchemaFilterContext context)
    {
        if (schema.Properties == null) return;

        // 获取当前类型所有带有DataMember特性的属性
        var dataMemberProps = context.Type.GetProperties()
            .Where(p => p.GetCustomAttribute<DataMemberAttribute>() != null);

        foreach (var prop in dataMemberProps)
        {
            var dataMemberAttr = prop.GetCustomAttribute<DataMemberAttribute>();
            // 匹配Swagger默认生成的驼峰属性名(比如MyTest -> myTest)
            var defaultPropName = char.ToLowerInvariant(prop.Name[0]) + prop.Name.Substring(1);

            if (schema.Properties.TryGetValue(defaultPropName, out var schemaProperty))
            {
                // 移除原属性名
                schema.Properties.Remove(defaultPropName);
                // 添加DataMember指定的名称
                schema.Properties[dataMemberAttr.Name] = schemaProperty;
            }
        }
    }
}
  1. 在Swagger配置中注册这个Filter:
builder.Services.AddSwaggerGen(c =>
{
    c.SchemaFilter<DataMemberSchemaFilter>();
    // 其他Swagger配置
});

完成以上配置后,Swagger请求体就会显示DataMember中指定的my_test名称了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 19:25:27