Thật không may, hiện tại không có hỗ trợ "ngoài luồng" System.Text.Json
để chuyển đổi các enum nullable.
Tuy nhiên, có một giải pháp bằng cách sử dụng trình chuyển đổi tùy chỉnh của riêng bạn . (xem bên dưới) .
Giải pháp. Sử dụng một công cụ chuyển đổi tùy chỉnh.
Bạn sẽ đính kèm có thể gắn nó vào tài sản của bạn bằng cách trang trí nó với trình chuyển đổi tùy chỉnh:
// using System.Text.Json
[JsonConverter(typeof(StringNullableEnumConverter<UserStatus?>))] // Note the '?'
public UserStatus? Status { get; set; } // Nullable Enum
Đây là công cụ chuyển đổi:
public class StringNullableEnumConverter<T> : JsonConverter<T>
{
private readonly JsonConverter<T> _converter;
private readonly Type _underlyingType;
public StringNullableEnumConverter() : this(null) { }
public StringNullableEnumConverter(JsonSerializerOptions options)
{
// for performance, use the existing converter if available
if (options != null)
{
_converter = (JsonConverter<T>)options.GetConverter(typeof(T));
}
// cache the underlying type
_underlyingType = Nullable.GetUnderlyingType(typeof(T));
}
public override bool CanConvert(Type typeToConvert)
{
return typeof(T).IsAssignableFrom(typeToConvert);
}
public override T Read(ref Utf8JsonReader reader,
Type typeToConvert, JsonSerializerOptions options)
{
if (_converter != null)
{
return _converter.Read(ref reader, _underlyingType, options);
}
string value = reader.GetString();
if (String.IsNullOrEmpty(value)) return default;
// for performance, parse with ignoreCase:false first.
if (!Enum.TryParse(_underlyingType, value,
ignoreCase: false, out object result)
&& !Enum.TryParse(_underlyingType, value,
ignoreCase: true, out result))
{
throw new JsonException(
$"Unable to convert \"{value}\" to Enum \"{_underlyingType}\".");
}
return (T)result;
}
public override void Write(Utf8JsonWriter writer,
T value, JsonSerializerOptions options)
{
writer.WriteStringValue(value?.ToString());
}
}
Hy vọng rằng sẽ giúp cho đến khi có hỗ trợ riêng mà không cần một công cụ chuyển đổi tùy chỉnh!