using System.ComponentModel;
using Newtonsoft.Json.Linq;
public int Number { get; set; }
public Package PackageType { get; set; }
public Level Level { get; set; }
[Description("Small Package")]
[Description("Medium Package")]
[Description("The Big One")]
[Description("Advanced Plus")]
public static void Main()
var myOrder = new Order() { Number = 123, PackageType = Package.Large, Level = Level.AdvancedPlus };
var settings = new JsonSerializerSettings();
settings.Converters.Add(new EnumDescriptionConverter());
string json = JsonConvert.SerializeObject(myOrder, settings);
Order deserializedOrder = JsonConvert.DeserializeObject<Order>(json, settings);
Console.WriteLine("\nDeserialized Order:");
Console.WriteLine($"Number: {deserializedOrder.Number}");
Console.WriteLine($"PackageType: {deserializedOrder.PackageType}");
Console.WriteLine($"Level: {deserializedOrder.Level}");
public class EnumDescriptionConverter : JsonConverter
public override bool CanConvert(Type objectType)
return objectType.IsEnum;
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
var description = GetEnumDescription((Enum)value);
writer.WriteValue(description);
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
var enumString = reader.Value.ToString();
foreach (var name in Enum.GetNames(objectType))
var enumValue = Enum.Parse(objectType, name);
if (GetEnumDescription((Enum)enumValue) == enumString)
throw new ArgumentException($"Unknown enum description for type {objectType}");
private string GetEnumDescription(Enum value)
FieldInfo fi = value.GetType().GetField(value.ToString());
DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false);
if (attributes != null && attributes.Length > 0)
return attributes[0].Description;