using System.Text.Json.Serialization;
for (int n = 0; n < 25; n++)
value = JsonSerializer.Deserialize<OrderInfo>("{ \"TaxType\": " + n + " }").TaxType;
Console.WriteLine($"{n}: {value}");
public TaxType TaxType { get; set; }
public enum TaxType : byte
public class CheckedEnumAttribute : JsonConverterAttribute { public CheckedEnumAttribute() : base(typeof(CheckedEnumConverterFactory)) { } }
public class CheckedEnumConverterFactory : JsonConverterFactory
public override bool CanConvert(Type typeToConvert)
public override JsonConverter CreateConverter(Type typeToConvert, JsonSerializerOptions options)
=> (JsonConverter)Activator.CreateInstance(typeof(CheckedEnumConverter<>).MakeGenericType(typeToConvert));
public class CheckedEnumConverter<T> : JsonConverter<T> where T: struct, Enum
static readonly TypeCode typeCode = Type.GetTypeCode(typeof(T));
public override T Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
T value = (T)(object)(typeCode switch
TypeCode.SByte => reader.GetSByte(),
TypeCode.Byte => reader.GetByte(),
TypeCode.Int16 => reader.GetInt16(),
TypeCode.UInt16 => reader.GetUInt16(),
TypeCode.Int32 => reader.GetInt32(),
TypeCode.UInt32 => reader.GetUInt32(),
TypeCode.Int64 => reader.GetInt64(),
TypeCode.UInt64 => reader.GetUInt64()
if (!Enum.IsDefined(value)) throw new Exception($"Value {value} is invalid!");
public override void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions options)
if (!Enum.IsDefined(value)) throw new Exception($"Value {value} is invalid!");
if (typeCode == TypeCode.UInt64)
writer.WriteNumberValue((ulong)(object)value);
writer.WriteNumberValue(Convert.ToInt64(value));