【问题标题】:Difficulty with parsing error JSON from ServiceNow REST API难以从 ServiceNow REST API 解析错误 JSON
【发布时间】:2016-04-07 17:46:16
【问题描述】:

我一直在用 C# 编写一个工具,它通过表 REST API 对 ServiceNow 进行几次调用。我正在使用 RESTsharp 进行 REST 调用,并使用 JSON.net 反序列化结果。这对于不返回错误的查询似乎非常有效。

        try
        {

            DataSet dataset = JsonConvert.DeserializeObject<DataSet>(response.Content);
            results = dataset.Tables["result"];

            return (results);
        }

        catch (Exception e)
        {
         ....
        }

但是,当返回错误(例如未找到结果)时,我在尝试解析错误时收到了意外的令牌异常。 “读取 DataTable 时出现意外的 JSON 令牌。预期 StartArray,得到 StartObject”

返回的确切 JSON 如下:

{
  "error": {
     "message": "No Record found"
     "detail": "Records matching query not found. Check query parameter or offset parameter"
   }
   "status": "failure"
}

我已经阅读了一些类似的问题并尝试制作自己的课程,但我不太确定应该如何实现它。

【问题讨论】:

  • 收到错误消息时,是否会以不同的方式返回 HTTP 状态代码?如果是这样,您可以检查响应的状态代码并根据状态代码以不同的方式反序列化您的响应。您可以创建一个简单的类来匹配错误对象 - 只需匹配返回的 json 的属性。
  • 是的,我希望它会返回 404 或其他内容,但上面的文字只是 200 OK。
  • 我对这种方法不是 100% 满意,但如果它们总是返回 200,你总是可以尝试反序列化到你自己的 catch 块中的“错误”对象。专门捕获UnexpectedTokenException 并尝试反序列化为错误对象。将通用的catch (Exception e) 也保留在那里。
  • 其实我说的不对。我刚刚再次检查,它确实返回 404。所以是的,我可以通过检查 HTTP 状态来解决这个问题。
  • 酷,您知道如何反序列化为Error 类吗?或者您需要帮助吗?

标签: c# json rest servicenow


【解决方案1】:

鉴于 Web 服务未正确返回错误状态,您可以解析为中间 JToken,然后检查响应是否看起来像错误:

var token = JToken.Parse(response.Content);
if (token.Type == JTokenType.Object && ((JToken)"failure").Equals(token["status"]))
{
    // Handle error explicitly
    return null;
}

var dataset = token.ToObject<DataSet>();
var results = dataset.Tables["result"];
return results;

或者,您可以捕获JsonException 并检查显式错误。我真的不推荐这种方法,因为它取决于这样一个事实,即错误的 JSON 不能巧合地反序列化为 DataSet 的 JSON:

try
{
    try
    {
        var dataset = JsonConvert.DeserializeObject<DataSet>(response.Content);
        var results = dataset.Tables["result"];

        return results;
    }
    catch (JsonException)
    {
        var token = JToken.Parse(response.Content);
        if (token.Type == JTokenType.Object && ((JToken)"failure").Equals(token["status"]))
        {
            // Handle error explicitly
            return null;
        }
        // OK, it's not an explicit error. rethrow
        throw;
    }
}
catch (Exception ex)
{
    // Generic error in the code somewhere.
    Debug.WriteLine(ex);
    // ... Other error handling as required
}

【讨论】:

  • @Noobixide - 我刚刚完成了这个答案,并阅读了你的评论,说你毕竟得到了正确的 404 回报。你还需要答案吗?
猜你喜欢
  • 2020-04-21
  • 2011-07-02
  • 2019-04-14
  • 2015-03-22
  • 1970-01-01
  • 1970-01-01
  • 2018-10-16
  • 2017-03-28
  • 2013-02-12
相关资源
最近更新 更多