c# - .NET 4.8 Web api 迁移到 .net 6 时出现错误枚举值的问题

标签 c# json.net .net-6.0 system.text.json .net-4.8

我正在将旧的 .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/

相关文章:

c# - GRPC - HTTP/2 服务器在连接上发送了无效数据。从 .netcore 3.1 升级到 net5 或 net6 时的 HTTP/2 错误代码 'PROTOCOL_ERROR

azure - 当 Azure Web 应用程序迁移到 .Net 6 时,虚拟连接字符串停止工作

c# - 在 Windows Phone 7 中获取 EXIF 标签

c# - Json.NET 不区分大小写的属性反序列化

c# - 使用 JSON.net 动态反序列化

json - Web API 2 Json 输出小写和下划线

azure - updateStartupCommandAndRuntimeStack 错误 azureweapp 部署

c# - 为什么返回 String.Length 而不是 DataSource 中的实际值

c# - 您可以从 iOS C 插件 "on the spot"写入 Unity 纹理吗?

c# - 从数据表中删除重复项