.NET Core中如何让Swagger显示DataMember指定的名称
解决Swagger请求体显示DataMember指定名称的问题
针对你遇到的Swagger显示属性名而非DataMember指定名称的问题,分两种常见场景给出解决方案:
场景1:使用Newtonsoft.Json(Json.NET)序列化
如果你的项目使用Newtonsoft.Json作为默认序列化器,只需配置Swagger遵循DataContract的序列化规则:
- 首先确保安装了
Swashbuckle.AspNetCore.NewtonsoftNuGet包 - 在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:
- 创建一个自定义的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; } } } }
- 在Swagger配置中注册这个Filter:
builder.Services.AddSwaggerGen(c => { c.SchemaFilter<DataMemberSchemaFilter>(); // 其他Swagger配置 });
完成以上配置后,Swagger请求体就会显示DataMember中指定的my_test名称了。
内容的提问来源于stack exchange,提问作者CF7
相关产品推荐
相关产品推荐

