C# serializace a deserilizace výčtového typu

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