Swagger生成OpenApi文档时枚举转换器报错问题求助
错误原因及解决方案
错误原因
- 你使用的
StringEnumConverter如果是System.Text.Json命名空间下的实现,它没有公共无参构造函数。Swagger在生成OpenAPI文档时,会尝试实例化枚举上标记的JsonConverter,但无法满足“无参构造”的要求,因此抛出该错误。 - JsonApiDotNetCore默认基于System.Text.Json进行序列化,而Swagger相关组件在处理System.Text.Json的
JsonConverter属性时兼容性存在问题——它更适配Newtonsoft.Json体系下的转换器规范(要求转换器具备可实例化的无参构造)。
解决方案
方案一:改用Newtonsoft.Json的StringEnumConverter
- 确保项目已引入
Newtonsoft.JsonNuGet包。 - 修改枚举的特性引用,切换到Newtonsoft的转换器:
using Newtonsoft.Json; using Newtonsoft.Json.Converters; using System.Runtime.Serialization; // 注意:不要用Enum作为自定义枚举的类型名,避免与System.Enum冲突 [JsonConverter(typeof(StringEnumConverter))] public enum YourCustomEnum { [EnumMember(Value = "Value1")] Value1, // 其他枚举值... }
方案二:自定义兼容的System.Text.Json枚举转换器
如果需要继续使用System.Text.Json体系,可以自定义一个带无参构造的枚举转换器:
using System.Text.Json; using System.Text.Json.Serialization; public class CustomStringEnumConverter : JsonConverterFactory { public override bool CanConvert(Type typeToConvert) { return typeToConvert.IsEnum; } public override JsonConverter CreateConverter(Type typeToConvert, JsonSerializerOptions options) { // 可根据需求调整命名策略,比如使用JsonNamingPolicy.CamelCase或自定义策略 return new JsonStringEnumConverter(JsonNamingPolicy.CamelCase); } }
然后修改枚举的特性标记:
[JsonConverter(typeof(CustomStringEnumConverter))] public enum YourCustomEnum { [EnumMember(Value = "Value1")] Value1, // 其他枚举值... }
内容的提问来源于stack exchange,提问作者kostas.kapasakis
相关产品推荐
相关产品推荐

