https://github.com/RSuter/NJsonSchema/wiki/JsonSchemaGenerator#integer-vs-string-enumerations
Integer vs string enumerations
JSON Schema supports integer and string enumerations. In Json.NET, enums are serialized as integer by default. However you can mark a property with the JsonConverterAttribute
so that it is serialized as string. NJsonSchema looks for these attributes and generates the enum JSON Schema respecting this attribute:
// Only this property is serialized as string
[JsonConverter(typeof(StringEnumConverter))]
public Gender Gender { get; set; }
// Always serialized as string
[JsonConverter(typeof(StringEnumConverter))]
public enum Gender
{
...
}
Also see Enums
So I think I have a similar problem. I'm looking for swagger to generate enums along with the int -> string mapping. The API must accept the int. The swagger-ui matters less, what I really want is code generation with a "real" enum on the other side (android apps using retrofit in this case).
So from my research this ultimately seems to be a limit of the OpenAPI specification which Swagger uses. It's not possible to specify names and numbers for enums.
The best issue I've found to follow is https://github.com/OAI/OpenAPI-Specification/issues/681 which looks like a "maybe soon" but then Swagger would have to be updated, and in my case Swashbuckle as well.
For now my workaround has been to implement a document filter that looks for enums and populates the relevant description with the contents of the enum.
GlobalConfiguration.Configuration .EnableSwagger(c => { c.DocumentFilter<SwaggerAddEnumDescriptions>(); //disable this //c.DescribeAllEnumsAsStrings()
SwaggerAddEnumDescriptions.cs:
using System; using System.Web.Http.Description; using Swashbuckle.Swagger; using System.Collections.Generic; public class SwaggerAddEnumDescriptions : IDocumentFilter { public void Apply(SwaggerDocument swaggerDoc, SchemaRegistry schemaRegistry, IApiExplorer apiExplorer) { // add enum descriptions to result models foreach (KeyValuePair<string, Schema> schemaDictionaryItem in swaggerDoc.definitions) { Schema schema = schemaDictionaryItem.Value; foreach (KeyValuePair<string, Schema> propertyDictionaryItem in schema.properties) { Schema property = propertyDictionaryItem.Value; IList<object> propertyEnums = property.@enum; if (propertyEnums != null && propertyEnums.Count > 0) { property.description += DescribeEnum(propertyEnums); } } } // add enum descriptions to input parameters if (swaggerDoc.paths.Count > 0) { foreach (PathItem pathItem in swaggerDoc.paths.Values) { DescribeEnumParameters(pathItem.parameters); // head, patch, options, delete left out List<Operation> possibleParameterisedOperations = new List<Operation> { pathItem.get, pathItem.post, pathItem.put }; possibleParameterisedOperations.FindAll(x => x != null).ForEach(x => DescribeEnumParameters(x.parameters)); } } } private void DescribeEnumParameters(IList<Parameter> parameters) { if (parameters != null) { foreach (Parameter param in parameters) { IList<object> paramEnums = param.@enum; if (paramEnums != null && paramEnums.Count > 0) { param.description += DescribeEnum(paramEnums); } } } } private string DescribeEnum(IList<object> enums) { List<string> enumDescriptions = new List<string>(); foreach (object enumOption in enums) { enumDescriptions.Add(string.Format("{0} = {1}", (int)enumOption, Enum.GetName(enumOption.GetType(), enumOption))); } return string.Join(", ", enumDescriptions.ToArray()); } }
This results in something like the following on your swagger-ui so at least you can "see what you're doing":