C#服务端使用JsonExtensionData问题:Swagger致额外属性丢失
解决JsonExtensionData的Swagger显示与属性丢失问题
一、隐藏Swagger中的AdditionalData属性
方法1:特性标记直接忽略
给AdditionalData属性添加[ApiExplorerSettings(IgnoreApi = true)]特性,让Swagger API探索器自动忽略该属性:
public class Request { public DateTime BirthDay { get; set; } public string FirstName { get; set; } public string LastName { get; set; } [JsonExtensionData] [ApiExplorerSettings(IgnoreApi = true)] public Dictionary<string, object> AdditionalData { get; set; } }
方法2:全局SchemaFilter批量过滤
如果多个类都用到[JsonExtensionData],可以写一个全局过滤器自动隐藏所有这类属性:
public class HideJsonExtensionDataFilter : ISchemaFilter { public void Apply(OpenApiSchema schema, SchemaFilterContext context) { var extensionDataProps = context.Type.GetProperties() .Where(p => p.GetCustomAttributes(typeof(JsonExtensionDataAttribute), true).Any()); foreach (var prop in extensionDataProps) { if (schema.Properties.ContainsKey(prop.Name)) { schema.Properties.Remove(prop.Name); } } } }
然后在Swagger配置中注册过滤器:
builder.Services.AddSwaggerGen(c => { c.SchemaFilter<HideJsonExtensionDataFilter>(); });
二、确保额外属性被正确存入AdditionalData
1. 强制使用JSON格式请求
客户端必须发送Content-Type: application/json类型的请求,表单数据(如application/x-www-form-urlencoded)的模型绑定不支持JsonExtensionData,只会解析匹配的属性。
2. 配置正确的JSON序列化器
情况1:用System.Text.Json(ASP.NET Core默认)
确保使用System.Text.Json.Serialization.JsonExtensionDataAttribute,可额外配置序列化规则:
builder.Services.AddControllers() .AddJsonOptions(options => { options.JsonSerializerOptions.PropertyNameCaseInsensitive = true; });
情况2:用Newtonsoft.Json(Json.NET)
若依赖Newtonsoft.Json特性,需替换默认序列化器:
builder.Services.AddControllers() .AddNewtonsoftJson(options => { options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); });
此时要使用Newtonsoft.Json.JsonExtensionDataAttribute标记属性。
3. 验证属性接收情况
在控制器中打印AdditionalData内容确认:
[HttpPost] public IActionResult Post(Request request) { if (request.AdditionalData != null) { foreach (var kvp in request.AdditionalData) { Console.WriteLine($"{kvp.Key}: {kvp.Value}"); } } return Ok(); }
内容的提问来源于stack exchange,提问作者Felix Arnold
相关产品推荐
相关产品推荐

