Есть ли способ отобразить все перечисления как их строковое значение в swagger вместо их значения int?
Я хочу иметь возможность отправлять действия POST и помещать перечисления в соответствии с их строковым значением без необходимости каждый раз смотреть на перечисление.
Я пробовал, DescribeAllEnumsAsStrings
но затем сервер получает строки вместо значения перечисления, а это не то, что мы ищем.
Кто-нибудь решил это?
Редактировать:
public class Letter
{
[Required]
public string Content {get; set;}
[Required]
[EnumDataType(typeof(Priority))]
public Priority Priority {get; set;}
}
public class LettersController : ApiController
{
[HttpPost]
public IHttpActionResult SendLetter(Letter letter)
{
// Validation not passing when using DescribeEnumsAsStrings
if (!ModelState.IsValid)
return BadRequest("Not valid")
..
}
// In the documentation for this request I want to see the string values of the enum before submitting: Low, Medium, High. Instead of 0, 1, 2
[HttpGet]
public IHttpActionResult GetByPriority (Priority priority)
{
}
}
public enum Priority
{
Low,
Medium,
High
}
Ответы:
Из документов :
Кроме того, если вы хотите, чтобы такое поведение выполнялось только для определенного типа и свойства, используйте StringEnumConverter:
источник
DescribeAllEnumsAsStrings
работал со свойствами объекта и даже с параметрами запроса для действий контроллера. Однако использованиеEnumDataTypeAttribute
иJsonConverter(typeof(StringEnumConverter))
у меня не сработало.Для ASP.NET Core 3 с библиотекой Microsoft JSON (System.Text.Json)
В Startup.cs / ConfigureServices ():
Для ASP.NET Core 3 с библиотекой Json.NET (Newtonsoft.Json)
Установите
Swashbuckle.AspNetCore.Newtonsoft
пакет.В Startup.cs / ConfigureServices ():
Для ASP.NET Core 2
В Startup.cs / ConfigureServices ():
Pre-ASP.NET Core
источник
AzureExtensions.Swashbuckle
, но, как и @DanFriedman, я не могу заставить enum-to-string работатьДумаю, у меня похожая проблема. Я ищу чванство для генерации перечислений вместе с сопоставлением строк int ->. API должен принимать int. Swagger-ui имеет меньшее значение, мне действительно нужна генерация кода с «настоящим» перечислением с другой стороны (в данном случае приложения для Android, использующие дооснащение).
Итак, из моих исследований, это, в конечном итоге, кажется ограничением спецификации OpenAPI, которую использует Swagger. Для перечислений невозможно указать имена и номера.
Лучшая проблема, которую я обнаружил, - это https://github.com/OAI/OpenAPI-Specification/issues/681, которая выглядит как «возможно, скоро», но тогда Swagger придется обновить, а в моем случае Swashbuckle как хорошо.
На данный момент моим обходным решением было реализовать фильтр документов, который ищет перечисления и заполняет соответствующее описание содержимым перечисления.
SwaggerAddEnumDescriptions.cs:
В результате в вашем swagger-ui появляется что-то вроде следующего, чтобы вы хотя бы могли «видеть, что делаете»:
источник
ASP.NET Core 3.1
Чтобы сгенерировать перечисления в виде строк с использованием Newtonsoft JSON, вы должны явно добавить поддержку Newtonsoft, добавив
AddSwaggerGenNewtonsoftSupport()
следующее:Это доступно в новом пакете
Swashbuckle.AspNetCore.Newtonsoft
. Похоже, что все остальное отлично работает без этого пакета, кроме поддержки enum converter.источник
StringEnumConverter
рассматривается как частный случай.Я хотел использовать ответ rory_za в приложении .NET Core, но мне пришлось немного изменить его, чтобы он работал. Вот реализация, которую я придумал для .NET Core.
Я также изменил его, чтобы он не предполагал, что базовый тип есть
int
, и использовал новые строки между значениями для облегчения чтения.Затем добавьте это в свой
ConfigureServices
метод в Startup.cs:источник
DescribeEnumParameters
в моем проекте расширения были пустыми. Я должен был забрасыватьparam
кNonBodyParameter
и проверить перечисление там:if (param is NonBodyParameter nbParam && nbParam.Enum?.Any() == true) { param.Description += DescribeEnum(nbParam.Enum); }
С ядром asp.net 3
Но похоже, что Swashbuckle Version 5.0.0-rc4 не готов поддерживать это. Поэтому нам нужно использовать параметр (устаревший) в файле конфигурации Swashbuckle, пока он не будет поддерживать и отражать его как библиотеку Newtonsoft.
Разница между этим ответом и другими ответами заключается в использовании только библиотеки Microsoft JSON вместо Newtonsoft.
источник
если кому-то интересно, я изменил код для работы с
.NET CORE 3 и Swagger V5
источник
.NET CORE 3.1 и SWAGGER 5
если вам нужно простое решение, чтобы выборочно передавать перечисления в виде строк:
Обратите внимание, мы используем
System.Text.Json.Serialization
пространство имен, а неNewtonsoft.Json
!источник
System.Text.Json
.DescribeAllEnumsAsStrings
конвертирую все перечисления в строку.Я только что сделал это, и он отлично работает!
Startup.cs
Model.cs
swagger.json
Надеюсь, это поможет вам, как помогло мне!
источник
DescribeAllEnumsAsStrings
устарелаисточник
Мой вариант для enum stings со значениями:
Настроить службы:
Фильтр:
источник
написать код внутри Startup.cs
источник
Я нашел здесь хорошее решение:
@PauloVetor - решил с помощью ShemaFilter вот так:
И в Startup.cs:
источник
model.Format
до,"string"
как обычно"int32"
.Я изменил ответ Хосама Рехани для работы с перечислениями с нулевым значением, а также с коллекцией перечислений. Предыдущий ответ также работает только в том случае, если свойство названо точно так же, как его тип. Все эти проблемы решаются в приведенном ниже коде.
Он работает с .net core 3.x и swagger 5.x.
в некоторых случаях это могло бы быть более эффективно, если бы не искать тип перечисления дважды.
чтобы использовать фильтр добавьте
c.DocumentFilter<SwaggerAddEnumDescriptions>();
в конфигурацию swagger вStartup.cs
.источник
.Net Core 3.0
источник
Это невозможно со стандартным OpenAPI. Перечисления описываются только их строковыми значениями.
К счастью, вы можете сделать это с помощью некоторых нестандартных расширений, которые используются вашим генератором клиентов.
NSwag поддерживает
x-enumNames
AutoRest поддерживает
x-ms-enum
.Openapi-generator поддерживает
x-enum-varnames
Другие генераторы могут поддерживать одно из этих расширений или иметь свои собственные.
Чтобы сгенерировать
x-enumNames
для NSwag, создайте следующий фильтр схемы:И зарегистрируйте его как:
источник
РЕШЕНИЕ ASP NET
В моих документах api одно перечисление по-прежнему отображалось как int, несмотря на то, что свойство было отмечено значком
StringEnumConverter
. Мы не могли позволить себе использовать глобальные настройки для всех перечисленных выше перечислений. Добавление этой строки в SwaggerConfig решило проблему:источник
В других ответах на то, что мы искали, я обнаружил ряд недостатков, поэтому я подумал, что предоставлю свой собственный взгляд на это. Мы используем ASP.NET Core 3.1 с System.Text.Json, но наш подход работает независимо от используемого сериализатора JSON.
Наша цель состояла в том, чтобы принимать строковые значения перечисления в нижнем регистре как в API ASP.NET Core, так и задокументировать то же самое в Swagger. В настоящее время мы используем
[DataContract]
и[EnumMember]
, поэтому подход состоит в том, чтобы взять значение в нижнем регистре из свойства EnumMember value и использовать его повсеместно.Наш пример перечисления:
Мы будем использовать значения EnumMember в Swashbuckle, используя ISchemaFilter, как показано ниже:
Мы используем сторонний NuGet пакет (GitHub репо ) , чтобы гарантировать , что эта схема именования также используется в ASP.NET Core. Настройте его в Startup.cs в ConfigureServices с помощью:
Наконец, нам нужно зарегистрировать наш ISchemaFilter в Swashbuckle, поэтому также добавьте следующее в ConfigureServices ():
источник
GetMembers()
было бы лучшеGetMembers(BindingFlags.Static | BindingFlags.Public)
ограничиться только фактическими объявленными свойствами перечисления, такими как "Blue". Я также адаптировал случай «else», чтобы возвращать Member.Name, если[EnumMember]
атрибута нет .Если версия swagger была 5.5.x, то вам необходимо:
установить: Install-Package Swashbuckle.AspNetCore.Newtonsoft -Version 5.5.0
services.AddSwaggerGenNewtonsoftSupport ();
Ссылка: https://github.com/domaindrivendev/Swashbuckle.AspNetCore#systemtextjson-stj-vs-newtonsoft
источник