很遗憾,目前System.Text.Json
不支持将可空枚举类型转换为JSON格式。
但是,您可以通过使用自定义转换器解决此问题。(请参见下文).
解决方案:使用自定义转换器。
您可以通过在属性上添加自定义转换器来实现:
[JsonConverter(typeof(StringNullableEnumConverter<UserStatus?>))]
public UserStatus? Status { get; set; }
这里是转换器:
public class StringNullableEnumConverter<T> : JsonConverter<T>
{
private readonly JsonConverter<T> _converter;
private readonly Type _underlyingType;
public StringNullableEnumConverter() : this(null) { }
public StringNullableEnumConverter(JsonSerializerOptions options)
{
if (options != null)
{
_converter = (JsonConverter<T>)options.GetConverter(typeof(T));
}
_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;
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());
}
}
希望这能帮到您,直到有原生支持而无需自定义转换器!