C# 从ServiceNow REST API解析错误JSON时遇到困难

C# 从ServiceNow REST API解析错误JSON时遇到困难,c#,json,rest,servicenow,C#,Json,Rest,Servicenow,我一直在用C#编写一个工具,通过TableRESTAPI对ServiceNow进行一些调用。我使用RESTsharp进行REST调用,使用JSON.net反序列化结果。对于不返回错误的查询,这似乎非常有效 try { DataSet dataset = JsonConvert.DeserializeObject<DataSet>(response.Content); results = dataset.

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

        try
        {

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

            return (results);
        }

        catch (Exception e)
        {
         ....
        }

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

鉴于web服务没有正确返回错误状态,您可以解析到中间层,然后检查响应是否看起来像错误:

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;

当您收到错误消息时,是否会以不同的方式返回HTTP状态码?如果是这样,您可以检查响应的状态代码,并根据状态代码对响应进行不同的反序列化。你可以创建一个简单的类来匹配error对象——只需匹配返回的json的属性。是的,我希望它会返回404或其他什么,但是上面的文本只有200行。我对这种方法不是100%满意,但是如果他们总是返回200,你可以尝试反序列化到你自己的“error”对象在捕捉块中。特别捕获
意外的TokenException
,并尝试反序列化到错误对象。把泛型的
catch(异常e)
也放在那里。实际上,我是不对的。我又查了一遍,它确实返回404。是的,我可以通过检查HTTP状态来解决这个问题。酷,你知道如何反序列化到
错误
类,或者你需要帮助吗?@Noobixide-我刚刚回答完这个问题,并阅读了你的评论,你最终得到了正确的404返回。你还需要答案吗?
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;
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
}