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

Swagger生成OpenApi文档时枚举转换器报错问题求助

错误原因及解决方案

错误原因

  • 你使用的StringEnumConverter如果是System.Text.Json命名空间下的实现,它没有公共无参构造函数。Swagger在生成OpenAPI文档时,会尝试实例化枚举上标记的JsonConverter,但无法满足“无参构造”的要求,因此抛出该错误。
  • JsonApiDotNetCore默认基于System.Text.Json进行序列化,而Swagger相关组件在处理System.Text.Json的JsonConverter属性时兼容性存在问题——它更适配Newtonsoft.Json体系下的转换器规范(要求转换器具备可实例化的无参构造)。

解决方案

方案一:改用Newtonsoft.Json的StringEnumConverter

  1. 确保项目已引入Newtonsoft.Json NuGet包。
  2. 修改枚举的特性引用,切换到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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 21:35:03