Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当Newtonsoft.JSON反序列化失败时,是否有方法返回自定义错误?_C#_Serialization_.net Core_Json.net_Asp.net Core Middleware - Fatal编程技术网

C# 当Newtonsoft.JSON反序列化失败时,是否有方法返回自定义错误?

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")]

我想在请求失败时更改ResponseBy,因为对枚举的反序列化未成功。该应用程序是一个.NETCore3API

我在我的一个实体上拥有以下属性:

[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
)。如果可能的话,您必须为所有不同类型的枚举找到一种更通用的方法(可能通过使用泛型…)