Search code examples
c#asp.net-corejson.netswaggerswashbuckle.aspnetcore

StringEnumConverter with Swagger


I'm using .Net Core 3.1 and some class have enums, and I'd like tha swagger API return enum as string.

Fox example:

namespace Model.Settings
{
    public enum SensorType
    {
        NONE = 0,
        IN = 1,
        OUT = 2
    }
}

......

namespace Model.Settings
{
    [JsonObject(NamingStrategyType = typeof(CamelCaseNamingStrategy))]
    public class SensorsSettings
    {
        [BsonElement("inOutDistance")]
        [Required]
        public int InOutDistance { get; set; }

        [BsonElement("type")]
        [BsonRepresentation(BsonType.String)]
        [JsonConverter(typeof(StringEnumConverter))]
        [Required]
        public SensorType[] Type { get; set; }
    }
}

So, when I call Http GET at API, I receive this JSON:

"sensorsSettings": {
      "inOutDistance": 65,
      "type": [
        1,
        2,
        0,
        0
      ]
    },

But I'd like:

"sensorsSettings": {
      "inOutDistance": 65,
      "type": [
        "IN",
        "OUT",
        "NONE",
        "NONE"
      ]
    },

Where I'm wrong?

<PackageReference Include="Swashbuckle.AspNetCore" Version="5.5.1" />
<PackageReference Include="Swashbuckle.AspNetCore.Newtonsoft" Version="5.5.1" />

Could you help me?


Solution

  • So yeah as you mentioned in comments the answer is to change [JsonConverter(typeof(StringEnumConverter))] attribute to [JsonProperty("type", ItemConverterType=typeof(StringEnumConverter))] attribute.


    You can also convert enums without these attributes.

    Just add this to your services:

    services.AddControllers()
        .AddJsonOptions(o => o.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter()));