V C# se při serializaci a deserializaci JSON velmi často potřebujeme vypořádat s výčtovými typy (enum). Ve výchozím nastavení je hodnota z výčtového typu interpretována jako celé číslo – to většinou nestačí, protože požadujeme textovou hodnotu. Pojďme si ukázat, jak to vyřešit nativní knihovnou System.Text.Json a knihovnou Newtonsoft.Json
public class Student
{
public string Name { get; set; }
public SexEnum Sex { get; set; }
}
public enum SexEnum
{
Female, Male
}
var student1 = new Student() { Name = "Pepek Vyskoc", Sex = SexEnum.Male }
// Native serialize
JsonSerializer.Serialize(student1);
// Newtonsoft
return JsonConvert.SerializeObject(student1);
Vrátí json:
{
"Name": "Pepek Vyskoc",
"Sex": 1
}
Funkční ale dost často nedostačující, protože z pohlaví 0 a 1 toho moc nepoznáme.
Serializace enum jako textový řetězec
Stačí přidat k požadované propertě anotaci *EnumConverter:
// Native
public class Student
{
...
[JsonConverter(typeof(JsonStringEnumConverter))]
public SexEnum Sex { get; set; }
...
}
// Newtonsoft
public class Student
{
...
[JsonConverter(typeof(StringEnumConverter))]
public SexEnum Sex { get; set; }
...
}
Kde získáme požadovaný formát odpovědi:
{
"Name": "Pepek Vyskoc",
"Sex": "Male"
}
Globální serializace enum jako textový řetězec
Pokud nechcete před každou propertu uvádět anotaci pro converter, máte možnost ji nastavit globálně do souboru Program.cs:
// Native
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers()
.AddJsonOptions(options =>
{
options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
});
// Newtonsoft
builder.Services.AddControllers()
.AddNewtonsoftJson(options =>
{
options.SerializerSettings.Converters.Add(new StringEnumConverter());
});
Tím dosáhneme požadovaného výsledku automaticky