簡體   English   中英

當 Newtonsoft.JSON 反序列化失敗時,有沒有辦法返回自定義錯誤?

[英]Is there a way to return a custom error when Newtonsoft.JSON deserialization fails?

我想在請求失敗時更改 ResponseBody,因為反序列化為 Enum 未成功。 該應用程序是一個 .NET Core 3 API。

我的實體之一具有以下屬性:

[JsonConverter(typeof(StringEnumConverter))]
public Attribute Attribute { get; set; }

其中 Attribute 是以下枚舉:

public enum Attribute
    {
        [EnumMember(Value = "value-1")]
        value1,
        [EnumMember(Value = "value-2")]
        value2,
        [EnumMember(Value = "some-value")]
        somevalue
    }

當我嘗試為 Enum 發布具有錯誤值的正文時:

{
  "attribute": "wrong-value"
}

我的端點返回一個帶有 Newtonsoft 錯誤的 400,我想返回一個由我創建的 ResponseBody。

{
    "errors": {
        "attribute": [
            "Error converting value \"wrong-value\" to type 'Project.Attribute'. Path 'attribute', line 10, position 24."
        ]
    },
    "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
    "title": "One or more validation errors occurred.",
    "status": 400,
    "traceId": "|1cf19d18-4577510ef4de1g923."
}

有沒有辦法用中間件攔截這樣的錯誤並返回一個自定義的 ResponseBody?

我要做的是創建一個StringEnumConverter類:

internal class StringEnumConverter : JsonConverter
{
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.String)
            try
            {
                return JsonConvert.DeserializeObject<Attribute>("'" + reader.Value.ToString() + "'");
            }
            catch
            {
                var tr = reader as JsonTextReader;
                throw new Exception($"Error converting value \"{reader.Value.ToString()}\" to type \"{objectType.ToString()}\". Path \"{tr.Path}\", line {tr.LineNumber}, position {tr.LinePosition}.");
            }
        throw new NotImplementedException();
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override bool CanConvert(Type objectType)
    {
        return true;
    }
}

然后在嘗試反序列化我的 JSON 字符串時,我會捕獲任何異常,例如:

string json = "{'attribute': 'value1x'}";

try
{
    MyClass r = JsonConvert.DeserializeObject<MyClass>(json);
}
catch (Exception e)
{
    Console.WriteLine(e.Message);
}

這樣我的 Exception 就會有適當的消息。 當然,您必須記住,這僅用於將字符串反序列化為Attribute類型(也許應該將名稱更改為StringToAttributeConverter以提高可讀性)。 如果可能,您將不得不為所有不同類型的枚舉找到一種稍微更通用的方法(也許通過使用通用...)。

暫無
暫無

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

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