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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 14:20:27