簡體   English   中英

.NET 4.8 webapi 遷移到 .net6 時出現 WrongEnum 值問題

[英].NET 4.8 webapi migrate to .net6 issue with WrongEnum value

我正在將舊的 .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; }
}

或者,如果您需要在全球范圍內執行此操作 - 創建一個轉換器工廠,它將重用該轉換器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM