如何从 swagger.json 中删除反引号

How to remove back quote from swagger.json

在我用 ASPNET Core 3.1 编写的 Web 应用程序中,使用 Swashbuckle.AspNetCore (5.2) 生成 OpenApi。我已经打开生成派生 类 by

GeneratePolymorphicSchemas()

在 swagger.json 中,我得到带有反引号 (`) 的 类。所以我的 类

public abstract class CommandResult
{
    public abstract IsSuccess {get;}
}

public class SuccessCommandResult
{
    public override IsSuccess => true;
}

public class SuccessCommandResult<TData> : SuccessCommand
{
    public TData Data {get;set;}
}

最后一个 类 我得到他们的名字 'SuccessCommandResult``1' (有单反引号字符,我加倍以保持漂亮 post fromatting),这对生成有问题TypeScript api 客户端。对于生成前端客户端,我使用 open-api-generator.

我的问题我如何解决生成问题?

OpenApi 本身不支持泛型,但您可以使用 SchemaId 方法自定义生成的名称,例如

c.SchemaId(t => t.FullName.Contains('`') 
    ? t.FullName.Substring(0, t.FullName.IndexOf('`')) + "OfT" 
    : t.FullName);

以上内容实际上来自official documentation,参见“修改生成的模式”。

为了补充上面的答案,我 运行 遇到了

的问题

SchemaId already used for different type

当我在 class 文档的通用类型字段中指定了特定的 classes 时。即

[ProducesResponseType(typeof(PagedResult<FirstViewModel>), StatusCodes.Status200OK)] [ProducesResponseType(typeof(PagedResult<SecondViewModel>), StatusCodes.Status200OK)]

为了解决这个问题,我做了以下工作


        private string GetSchemaId(Type type)
        {
            var schemaBase = type.Name.Contains('`') 
                ? type.Name.Substring(0, type.Name.IndexOf('`')) + "OfT" 
                : type.Name;

            if (!type.IsGenericType)
            {
                return $"{schemaBase}";
            }
            
            string? schemaGeneric = "";
            if (type.GenericTypeArguments.Length == 0)
            {
                schemaGeneric = $"<{Guid.NewGuid()}>";
            }

            schemaGeneric += "<";
            for (var i = 0; i < type.GenericTypeArguments.Length; i++)
            {
                var typeArg = type.GenericTypeArguments.ElementAt(i);

                schemaGeneric += GetSchemaId(typeArg);
                
                if (i == type.GenericTypeArguments.Length - 1) continue;

                schemaGeneric += ", ";
            }

            schemaGeneric += ">";
            return schemaBase + schemaGeneric;
        }

然后这样称呼它

        public void Configure(SwaggerGenOptions options)
        {
            options.CustomSchemaIds(type =>
            {
                return GetSchemaId(type);
            });
        }  

这将 generate schemas like so in swagger

这适用于将 swagger.json 导入 Visual Studios Connected Services 以自动生成 API 客户端