Json enum description string to enum converter:
using System;
using System.Globalization;
using System.Linq;
using System.Runtime.Serialization;
using System.Text.Json;
using System.Text.Json.Serialization;
namespace Common.Converters
{
public class JsonEnumDescriptionToEnumConverter : JsonConverterFactory
{
public override bool CanConvert(Type typeToConvert) => typeToConvert.IsEnum;
public override JsonConverter CreateConverter(Type typeToConvert, JsonSerializerOptions options) =>
(JsonConverter)Activator.CreateInstance(typeof(JsonEnumDescriptionToEnumConverter<>).MakeGenericType(typeToConvert))!;
}
public class JsonEnumDescriptionToEnumConverter<TEnum> : JsonConverter<TEnum> where TEnum : struct, Enum
{
public override bool CanConvert(Type typeToConvert) => typeToConvert.IsEnum;
public override TEnum Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
var description = reader.GetString();
try
{
return Enum.GetValues(typeof(TEnum)).Cast<TEnum>().First(enumItem => enumItem.ToDescription().Equals(description));
}
catch
{
throw new SerializationException($"Enum description '{description}' cannot be converted to enum type {typeof(TEnum)}.");
}
}
public override void Write(Utf8JsonWriter writer, TEnum value, JsonSerializerOptions options)
{
writer.WriteStringValue(value.ToDescription().ToString(CultureInfo.InvariantCulture));
}
}
}