当我处理可能出错的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错误?
答案 0 :(得分:1)
对于ServiceStack,错误处理已有详细记录: https://github.com/ServiceStack/ServiceStack/wiki/Error-Handling
基本上,您将在出错时获得HTTP 400,405,403或500状态响应。
否则,您可以将其视为成功。
如果是错误,您将在JSON响应中收到ResponseStatus DTO。它包含属性:
那应该给你你想要的东西。
更新: 如果您实际上对服务代码或发出的错误没有任何控制或知识,并且您正在编写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 = { .... }
}