Enumerations in C# are ints by default, which is fine most of the time. That said, there are situations where you’d want to store and retrieve them using their string names, especially when you are persisting them to a database. The string names make them more readable for one reason. For another, a re-ordering of the enums (caused inadvertently by the addition or removal of an entry) would change their int values, which can potentially break your data when reading them back from a database. Consider the following types – Model
and Seasons
.
enum Seasons
{
Spring,
Summer,
Fall,
Winter
}
class Model
{
public string Name { get; set; } = String.Empty;
public Seasons Season { get; set; }
}
If you serialize an instance of Model
, you’d see the int value for the Season
property.
var model = new Model
{
Name = "Test Model",
Season = Seasons.Fall,
};
var json = JsonConvert.SerializeObject(model, Formatting.Indented);
Console.WriteLine(json);
Output looks like this.
{
"Name": "Test Model",
"Season": 2
}
It’s fairly easy to change this behavior though. Just add a JsonConverter
attribute to the Season
property.
class Model
{
public string Name { get; set; } = String.Empty;
[JsonConverter(typeof(StringEnumConverter))]
public Seasons Season { get; set; }
}
Output is now nice and clean.
{
"Name": "Test Model",
"Season": "Fall"
}
You get the same behavior both when serializing and deserializing, and the latter is important when reading data back from a database.
How about if you have a collection of enums though? That’s simple too, just replace the JsonConverter
attribute with the following JsonProperty
attribute.
class Model
{
public string Name { get; set; } = String.Empty;
[JsonProperty(ItemConverterType = typeof(StringEnumConverter))]
public List<Seasons> Seasons { get; set; } = new List<Seasons>();
}
Output is as expected.
{
"Name": "Test Model",
"Seasons": [
"Fall",
"Winter"
]
}