C# + .NET 7.0 - Serialize (Convert) Enum to String in API Response
Built with .NET 7.0
This is a quick post to show how to configure an ASP.NET Core API to serialize all enum properties to strings in HTTP responses.
By default enum properties are returned as a number, for example if you have the following enum for user roles:
public enum Role
{
Admin,
User
}
A user with the Role = Role.Admin
would be returned from the API as "role": 0
, e.g:
{
"id": 1,
"title": "Mr",
"firstName": "George",
"lastName": "Costanza",
"email": "[email protected]",
"role": 0
}
Convert Enums to Strings with JsonStringEnumConverter
To convert enums to strings in API responses so the above role would return the value "role": "Admin"
, add a call to .AddJsonOptions()
after services.AddControllers()
in the Program.cs file, and add a new JsonStringEnumConverter()
to the JsonSerializerOptions.Converters
list like the following.
services.AddControllers().AddJsonOptions(x =>
{
// serialize enums as strings in api responses (e.g. Role)
x.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
});
Example .NET 7 Program.cs File
Below is a complete .NET 7 Program file that includes the above snippet to convert enums to strings. It's from a CRUD API tutorial I posted recently, the complete project and documentation is available at .NET 7.0 + Dapper + SQLite - CRUD API Tutorial in ASP.NET Core.
The Program file configures dependency injection, initializes a SQLite database, configures the HTTP request pipeline and starts the API.
using System.Text.Json.Serialization;
using WebApi.Helpers;
using WebApi.Repositories;
using WebApi.Services;
var builder = WebApplication.CreateBuilder(args);
// add services to DI container
{
var services = builder.Services;
var env = builder.Environment;
services.AddSingleton<DataContext>();
services.AddCors();
services.AddControllers().AddJsonOptions(x =>
{
// serialize enums as strings in api responses (e.g. Role)
x.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
// ignore omitted parameters on models to enable optional params (e.g. User update)
x.JsonSerializerOptions.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull;
});
services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());
// configure DI for application services
services.AddScoped<IUserRepository, UserRepository>();
services.AddScoped<IUserService, UserService>();
}
var app = builder.Build();
// ensure database and tables exist
{
using var scope = app.Services.CreateScope();
var context = scope.ServiceProvider.GetRequiredService<DataContext>();
await context.Init();
}
// configure HTTP request pipeline
{
// global cors policy
app.UseCors(x => x
.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader());
// global error handler
app.UseMiddleware<ErrorHandlerMiddleware>();
app.MapControllers();
}
app.Run("http://localhost:4000");
Need Some .NET Help?
Search fiverr for freelance .NET developers.
Follow me for updates
When I'm not coding...
Me and Tina are on a motorcycle adventure around Australia.
Come along for the ride!