如何解决NSwag将x-enum-varnames标记添加到所有枚举
是否可以向NSwag中的所有枚举添加 x-enum-varnames ?我有这个例子,但是您必须指定所有枚举。有更通用的解决方案吗?另外,此示例创建了我不理解的第二个实例 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",1
],"x-enum-varnames": [
"Error","Success"
]
},
解决方法
我找到了另一个解决方案,您可以在 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());
});
,
我认为对我来说最好的解决方案是将枚举的json序列化设置为字符串:
services.AddControllers().AddJsonOptions( options =>
{
options.JsonSerializerOptions.Converters.Add( new JsonStringEnumConverter() );
});
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。