【问题标题】:NSwag add x-enum-varnames tag to all enumsNSwag 为所有枚举添加 x-enum-varnames 标签
【发布时间】:2021-02-14 21:55:40
【问题描述】:

是否可以将 x-enum-varnames 添加到 NSwag 中的所有枚举?我有这个例子,但是你必须指定所有的枚举。有没有更通用的解决方案?此外,此示例创建了我不理解的第二个实例 ResultCode2

https://github.com/RicoSuter/NSwag/issues/1993

public class NSwagProcessor : IOperationProcessor
{
    public bool Process( OperationProcessorContext context )
    {
        JsonSchema schema = JsonSchema.FromType<ResultCode>();
        if( schema.ExtensionData == null )
        {
            schema.ExtensionData = new Dictionary<string, object>();
        }

        string[] enumerationNames = new string[ schema.EnumerationNames.Count ];
        schema.EnumerationNames.CopyTo( enumerationNames, 0 );
        schema.ExtensionData.Add( "x-enum-varnames", enumerationNames );

        if( context.Settings.TypeMappers.Any( t => t.MappedType == typeof( ResultCode ) ) == false )
        {
            context.Settings.TypeMappers.Add( new ObjectTypeMapper( typeof( ResultCode ), schema ) );
        }

        return true;
    }
}

...

services.AddOpenApiDocument( config => {
    config.OperationProcessors.Add( new NSwagProcessor() );
} );

这会创建:

"ResultCode": {
    "type": "integer",
    "description": "",
    "x-enumNames": [
      "Error",
      "Success"
    ],
    "enum": [
      0,
      1
    ]
  },

...

"ResultCode2": {
    "title": "ResultCode",
    "type": "integer",
    "description": "",
    "x-enumNames": [
      "Error",
      "Success"
    ],
    "enum": [
      0,
      1
    ],
    "x-enum-varnames": [
      "Error",
      "Success"
    ]
  },

【问题讨论】:

    标签: .net-core openapi openapi-generator nswag


    【解决方案1】:

    我找到了另一个解决方案,你可以在 NSwag openapi 生成中添加一个Schema processor。通过添加以下模式处理器:

    public class XEnumVarnamesNswagSchemaProcessor : ISchemaProcessor
    {
        public void Process(SchemaProcessorContext context)
        {
            if (context.Type.IsEnum)
            {
                if (context.Schema.ExtensionData is not null)
                {
                    context.Schema.ExtensionData.Add("x-enum-varnames", context.Schema.EnumerationNames.ToArray());
                }
                else
                {
                    context.Schema.ExtensionData = new Dictionary<string, object>()
                    {
                        {"x-enum-varnames", context.Schema.EnumerationNames.ToArray()}
                    };
                }
            }
        }
    }
    

    一个额外的字段将被添加到所有 openapi 枚举模式/类型。 您需要在 Startup.cs 中将处理器添加到 NSwag 服务。

    services.AddOpenApiDocument(configuration =>
            {
                configuration.SchemaProcessors.Add(new XEnumVarnamesNswagSchemaProcessor());
            });
    

    【讨论】:

      【解决方案2】:

      我认为对我来说最好的解决方案是将枚举的 json 序列化设置为字符串:

      services.AddControllers().AddJsonOptions( options =>
      {
          options.JsonSerializerOptions.Converters.Add( new JsonStringEnumConverter() );
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-03-09
        • 2014-09-24
        • 2020-08-03
        • 2022-09-28
        • 2021-01-17
        • 1970-01-01
        • 2013-11-18
        相关资源
        最近更新 更多