[英]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.