C# 当Newtonsoft.JSON反序列化失败时,是否有方法返回自定义错误?
我想在请求失败时更改ResponseBy,因为对枚举的反序列化未成功。该应用程序是一个.NETCore3API 我在我的一个实体上拥有以下属性:C# 当Newtonsoft.JSON反序列化失败时,是否有方法返回自定义错误?,c#,serialization,.net-core,json.net,asp.net-core-middleware,C#,Serialization,.net Core,Json.net,Asp.net Core Middleware,我想在请求失败时更改ResponseBy,因为对枚举的反序列化未成功。该应用程序是一个.NETCore3API 我在我的一个实体上拥有以下属性: [JsonConverter(typeof(StringEnumConverter))] public Attribute Attribute { get; set; } 其中属性是以下枚举: public enum Attribute { [EnumMember(Value = "value-1")]
[JsonConverter(typeof(StringEnumConverter))]
public Attribute Attribute { get; set; }
其中属性是以下枚举:
public enum Attribute
{
[EnumMember(Value = "value-1")]
value1,
[EnumMember(Value = "value-2")]
value2,
[EnumMember(Value = "some-value")]
somevalue
}
当我尝试为枚举发布具有错误值的正文时:
{
"attribute": "wrong-value"
}
我的端点返回一个带有Newtonsoft错误的400,我想返回一个由我创建的ResponseBy
{
"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."
}
有没有办法用中间件截获此类错误并返回自定义的ResponseBy?我要做的是创建一个
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;
}
}
内部类StringEnumConverter:JsonConverter
{
公共重写对象ReadJson(JsonReader阅读器,类型objectType,对象existingValue,JsonSerializer序列化程序)
{
if(reader.TokenType==JsonToken.String)
尝试
{
返回JsonConvert.DeserializeObject(“”+reader.Value.ToString()+“”);
}
抓住
{
var tr=读卡器作为JsonTextReader;
抛出新异常($“将值\“{reader.value.ToString()}\”转换为类型\“{objectType.ToString()}\”。路径\“{tr.Path}\”,行{tr.LineNumber},位置{tr.LinePosition}”);
}
抛出新的NotImplementedException();
}
公共重写void WriteJson(JsonWriter编写器、对象值、JsonSerializer序列化器)
{
抛出新的NotImplementedException();
}
公共覆盖布尔CanConvert(类型objectType)
{
返回true;
}
}
然后,在尝试反序列化JSON字符串时,我会捕获任何异常,如:
string json = "{'attribute': 'value1x'}";
try
{
MyClass r = JsonConvert.DeserializeObject<MyClass>(json);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
string json=“{'attribute':'value1x'}”;
尝试
{
MyClass r=JsonConvert.DeserializeObject(json);
}
捕获(例外e)
{
控制台写入线(e.Message);
}
这样,我的异常将具有适当的消息。当然,您必须记住,这仅用于将字符串反序列化为属性
类型(为了更具可读性,可能应该将名称更改为StringToAttributeConverter
)。如果可能的话,您必须为所有不同类型的枚举找到一种更通用的方法(可能通过使用泛型…)