JsonSerializer尝试DeserializeFromString

时间:2014-05-27 14:21:49

标签: c# servicestack jsonserializer

当我处理可能出错的json响应时,我使用此方法确定json 实际上是错误还是可能是预期回应

bool TryParseResponseToError(string jsonResponse, out Error error)
{
    // Check expected error keywords presence
    // before try clause to avoid catch performance drawbacks
    if (jsonResponse.Contains("error") &&
        jsonResponse.Contains("status") &&
        jsonResponse.Contains("code"))
    {
        try
        {
            error = new JsonSerializer<Error>().DeserializeFromString(jsonResponse);
            return true;
        }
        catch
        {
            // The JSON response seemed to be an error, but failed to deserialize.
            // It may be a successful JSON response : do nothing.
        }
    }

    error = null;
    return false;
}

但是,我有一个空的捕获,这是一个糟糕的代码味道。

我在 ServiceStack 库中没有看到任何TryToDeserialize种方法。有没有?

如何使用 ServiceStack 处理json错误?

3 个答案:

答案 0 :(得分:1)

对于ServiceStack,错误处理已有详细记录: https://github.com/ServiceStack/ServiceStack/wiki/Error-Handling

基本上,您将在出错时获得HTTP 400,405,403或500状态响应。

否则,您可以将其视为成功。

如果是错误,您将在JSON响应中收到ResponseStatus DTO。它包含属性:

  • public string ErrorCode
  • 公共字符串消息
  • public string StackTrace
  • public List&lt; ResponseError&gt;错误

那应该给你你想要的东西。

更新: 如果您实际上对服务代码或发出的错误没有任何控制或知识,并且您正在编写HTTP客户端应用程序,则需要手动检查服务“通过网络”返回的内容。

换句话说,您希望服务在响应JSON中返回错误,但您不知道JSON的格式是什么。因此,您无法将其序列化为某种类型。

检查HTTP响应JSON的一种好方法是使用Fiddler utility。它将安装在您的Web浏览器和远程Web服务器之间(作为代理)。您可以点击服务网址,然后查看Fiddler响应(JSON或RAW)。一旦看到原始响应,您就会知道如何创建适合将JSON序列化的C#类。

答案 1 :(得分:0)

这似乎是检查是否存在错误的不好方法。通常,您将尝试使用某种响应对象将错误对象作为成员变量。您需要将jsonResponse字符串反序列化为响应对象,以正确隔离所有必需的字段。这样就可以避免空的catch块,并且可以更好地处理反序列化。

答案 2 :(得分:0)

通常我想使用HTTP状态代码来发送错误信号,而不是以预期的消息格式对它们进行编码。因此200 OK响应将包含来自API的有效JSON数据,但是其他响应(即4xx,5xx)指示错误。在后一种情况下,您将消息解码为错误而不是预期的响应。

如果不可能,可能是由于历史原因,我看到的模式是使用JSON对象周围的包装。

错误:

{
   success = false,
   message = "There was an error.",
   data = null
}

成功:

{
    success = true,
    message = null,
    data = { .... }
}