如何控制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
相关产品推荐
相关产品推荐

