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

如何控制OpenApiExample对象的JSON序列化并添加TypeNameHandling配置?

解决方法

方案1:全局配置OpenApi扩展的序列化规则(推荐)

Azure Functions OpenApi扩展默认独立维护序列化配置,不会自动读取业务逻辑中定义的Json序列化规则,你可以通过自定义序列化器工厂覆盖默认配置:

  • 新建自定义序列化器工厂类,实现IOpenApiSerializerFactory接口:
using Microsoft.Azure.WebJobs.Extensions.OpenApi.Core.Abstractions;
using Newtonsoft.Json;

public class CustomOpenApiSerializerFactory : IOpenApiSerializerFactory
{
    private readonly JsonSerializerSettings _settings = new()
    {
        TypeNameHandling = TypeNameHandling.Auto,
        // 其他业务用到的序列化配置也可以在此处统一添加,比如命名策略、空值处理规则等
    };

    public JsonSerializer Create()
    {
        return JsonSerializer.Create(_settings);
    }
}
  • 在Function项目的启动配置类中注册这个自定义工厂:
using Microsoft.Azure.Functions.Extensions.DependencyInjection;
using Microsoft.Azure.WebJobs.Extensions.OpenApi.Core.Abstractions;
using Microsoft.Extensions.DependencyInjection;

[assembly: FunctionsStartup(typeof(YourProjectNamespace.Startup))]
namespace YourProjectNamespace
{
    public class Startup : FunctionsStartup
    {
        public override void Configure(IFunctionsHostBuilder builder)
        {
            builder.Services.AddSingleton<IOpenApiSerializerFactory, CustomOpenApiSerializerFactory>();
            // 其余服务注册逻辑保持不变
        }
    }
}

配置完成后,OpenApi生成示例、Schema时都会自动应用带TypeNameHandling.Auto的序列化规则,自动生成$type字段。

方案2:针对单个Example手动添加(临时兼容场景)

如果你不想全局修改配置,仅需要特定示例展示$type字段,可以在OpenApiExample<List<T>>实现类的Build方法中手动构造带$type的返回内容:

using Microsoft.Azure.WebJobs.Extensions.OpenApi.Core.Abstractions;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

public class EventListExample : OpenApiExample<List<Event>>
{
    public override IOpenApiExample<List<Event>> Build(NamingStrategy namingStrategy = null)
    {
        var exampleEvents = new List<Event>
        {
            new SpecificEvent { /* 给示例字段赋值 */ }
        };
        // 用自定义配置序列化后转成JObject加入示例,即可保留$type字段
        var serializer = JsonSerializer.Create(new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Auto });
        var jArray = JArray.FromObject(exampleEvents, serializer);
        
        Examples.Add(
            OpenApiExampleResolver.Resolve("事件列表示例", jArray.ToObject<List<Event>>(), namingStrategy)
        );

        return this;
    }
}

注意事项

  • 确保示例集合的声明类型是基类List<Event>,集合内的实例是派生类SpecificEvent,TypeNameHandling.Auto只有在声明类型和实际实例类型不一致时才会自动写入$type字段。
  • 如果使用v3以上版本的Azure Functions OpenApi扩展,需要确认项目引用的Newtonsoft.Json版本和扩展依赖的版本兼容,避免出现序列化冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 12:24:07