Using the System.Text.Json serializer capabilities in .NET Core, how can I specify a custom value for an enum value, similar to JsonPropertyName? For example:
public enum Example {
Trick,
Treat,
[JsonPropertyName("Trick-Or-Treat")] // Error: Attribute 'JsonPropertyName' is not valid on this declaration type. It is only valid on 'property, indexer' declarations.
TrickOrTreat
}
In .net-core-5.0 and asp.net-core-5.0, Microsoft has added support for de/serializing enums via the JsonStringEnumConverter Class.
Decorate your enumeration's values like this:
using System.Runtime.Serialization;
public enum VipStatus
{
[EnumMember(Value = @"IS_VIP")]
VIP = 1,
[EnumMember(Value = @"IS_NOT_VIP")]
NonVIP = 2,
}
Given a class like this one:
class MyClass {
public VipStatus MyVipStatus { get; set; }
}
You could use JsonStringEnumConverter inline to serialize an instance of the class like this:
using System.Text.Json;
using System.Text.Json.Serialization;
// ...
var myObjectWithEnums = new MyClass()
{
MyVipStatus = VipStatus.NonVIP
};
var options = new JsonSerializerOptions();
// Configures serialization to allow strings to be accepted and auto-converted to enum values.
options.Converters.Add(new JsonStringEnumConverter());
var json = JsonSerializer.Serialize(myObjectWithEnums, options);
// serialized output is: { "myVipStatus": "IS_NOT_VIP"}
If you're using ASP.NET Core 5 then you could configure the app at startup to use JsonStringEnumConverter to serialize all incoming requests:
public async void ConfigureServices(IServiceCollection services) {
// ...
services
.AddControllers()
.AddJsonOptions(options => {
// Configures serialization to allow strings to be accepted and auto-converted to enum values.
options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
}
// ...
});
More reading: How to serialize and deserialize (marshal and unmarshal) JSON in .NET Core. If you're working in ASP.NET then this is also of interest: Web defaults for JsonSerializerOptions.
In case of .NET 5:
services.AddControllers()
.AddJsonOptions(opts => opts.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter()));