我正在将旧的 .NET 4.8 Web API 迁移到 .NET 6,并发现 Json 转换存在问题。例如,这是 .NET 4.8 中的示例 Web API:
public enum SampleEnum
{
Bar,
Baz,
}
public class Jerry
{
public SampleEnum MyEnum { get; set; }
}
public class ValuesController : ApiController
{
// POST api/values
public void Post([FromBody] Jerry value)
{
var a = value;
}
}
如果请求的值明显错误:
{
"MyEnum": "MonthEnd"
}
.net 4.8 中的上述 webapi 将使用枚举 (Bar) 的默认值。
对于 .net 6 中使用 NewtonJson 或 Json.Text 的相同代码,它将抛出异常,说我无法理解 MonthEnd。
.net 6 是正确的行为,因为用户传递了错误的值,但我的问题是我们的 webapi 已经投入生产很长时间了,我们不能冒客户投诉突然激增的风险。
有没有办法模仿 .net 4.8 的行为(即,如果无法理解枚举值,我们会回退到 deafult )?
最佳答案
您可以使用自定义转换器来解决此问题。例如如下所示:
class CustomEnumConverter<T> : JsonConverter<T> where T: struct, Enum
{
public override T Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
if (Enum.TryParse<T>(reader.GetString(), out var r))
{
return r;
}
return default;
}
public override void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions options) => writer.WriteStringValue(value.ToString("G"));
}
然后用它标记相应的属性:
public class Jerry
{
[JsonConverter(typeof(CustomEnumConverter<SampleEnum>))]
public SampleEnum MyEnum { get; set; }
}
或者,如果您需要在全局范围内执行此操作 - 创建一个 converter factory这将重用此转换器。
关于c# - .NET 4.8 Web api 迁移到 .net 6 时出现错误枚举值的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74900780/