C# Json Type Converter for Enum and String, Int Conversion

2022年7月18日 3397点热度 4人点赞 0条评论
内容目录

Define the Converter:

public class EnumStringConverter : JsonConverter<Enum>
{
	public override bool CanConvert(Type objectType)
	{
		return objectType.IsEnum;
	}

	public override Enum Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
	{
		var value = reader.GetString();
		if (value == null)
		{
			throw new ArgumentNullException(nameof(value));
		}

		if (Enum.TryParse(typeToConvert, value.ToString(), out var result))
		{
			return (Enum)result!;
		}
		throw new InvalidOperationException("Value is not within the enum range");
	}

	public override void Write(Utf8JsonWriter writer, Enum value, JsonSerializerOptions options)
	{
		writer.WriteStringValue(Enum.GetName(value.GetType(), value));
	}
}

Then, define the Attribute:

[AttributeUsage(AttributeTargets.Enum | AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)]
public class EnumConverterAttribute : JsonConverterAttribute
{
	public static bool IsNullableType(Type that)
	{
		return !(that == null) && !that.IsArray && that.FullName!.StartsWith("System.Nullable`1[");
	}
	public override JsonConverter CreateConverter(Type typeToConvert)
	{
		return new EnumStringConverter();
	}
}

Usage:

using System.Text.Json;

public enum A
{
	A,
	B,
	C
}

class B
{
	[EnumConverter]
	public A A { get; set; }
}

void Main()
{
	var b = JsonSerializer.Deserialize<B>("{\"A\":\"B\"}");
}

痴者工良

高级程序员劝退师

文章评论