【问题标题】:Treating error on deserializing json处理反序列化 json 的错误
【发布时间】:2018-01-11 11:27:08
【问题描述】:

我的问题基本上是这样的: 我有一个 API 的输出,它返回一个 json,其中包含一个名为“error”的元素以及任何消息。当我试图反序列化我的对象并且服务器返回一个错误时,我得到这个 json 而不是我的 json 对象(产品、订单......)。

这是发生错误的代码:

try
{
    using (var response = (HttpWebResponse)requisicao.GetResponse()) // **here happens the exception**
    {
        using (var stream = new StreamReader(response.GetResponseStream()))
            retorno = JsonConvert.DeserializeObject<TModelo>(stream.ReadToEnd());
    }
}

所以...我想收到此消息错误,但我无法处理(反序列化)它,因为它给我一个异常。 如果我可以反序列化对象,我会收到错误消息,因为代表我的对象的实体继承了错误对象(下面这个)

public class Erro
{
    [JsonProperty("error")]
    string MensagemErro { get; set; }
}

提前致谢。

【问题讨论】:

    标签: c# json json.net deserialization json-deserialization


    【解决方案1】:

    如果您在获取响应时遇到错误;

    (HttpWebResponse)requisicao.GetResponse()
    

    这意味着服务器没有向您返回正确的消息。因此,反序列化没有响应消息,唯一的选择是在 catch 块中处理错误。

    它看起来像;

    try
    {
        using (var response = (HttpWebResponse)requisicao.GetResponse()) // **here happens the exception**
        {
            using (var stream = new StreamReader(response.GetResponseStream()))
                retorno = JsonConvert.DeserializeObject<TModelo>(stream.ReadToEnd());
        }
    }
    catch (WebException e)
    {
        WebResponse response = e.Response;
        using (StreamReader reader =
            new StreamReader(response.GetResponseStream()))
        {
            string text = reader.ReadToEnd();//Content of error message
        }
    }
    

    【讨论】:

    • 知道了。但是我在 Postman 应用程序上做了完全相同的事情,服务器用错误消息回复了我。他们俩有什么区别吗?谢谢
    • 它返回了 404 但是 和预期的 json。如下:{ "error": "Não foi possível encontrar Product: testInvalidSKU" }
    • 如果你有 404 响应,无论如何都会抛出异常。我更新了答案。您可以在 catch 块中读取 404 错误的内容。
    • 是的!现在我可以读取我期待的 json。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-23
    • 1970-01-01
    • 2018-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多