C# 在RestSharp中优雅地处理空json对象

C# 在RestSharp中优雅地处理空json对象,c#,.net,restsharp,C#,.net,Restsharp,我有以下代码: public void GetJson() { RestRequest request = new RestRequest(Method.GET); var data = Execute<Dictionary<string, MyObject>>(request); } public T Execute<T>(RestRequest request) where T : new() { RestClient clie

我有以下代码:

public void GetJson()
{
    RestRequest request = new RestRequest(Method.GET);

    var data = Execute<Dictionary<string, MyObject>>(request);
}

public T Execute<T>(RestRequest request) where T : new()
{
    RestClient client = new RestClient(baseUrl);
    client.AddHandler("text/plain", new JsonDeserializer());

    var response = client.Execute<T>(request);

    return response.Data;
}
public void GetJson()
{
RestRequest请求=新的RestRequest(Method.GET);
var数据=执行(请求);
}
public T Execute(RestRequest请求),其中T:new()
{
RestClient=newrestclient(baseUrl);
AddHandler(“text/plain”,新的JsonDeserializer());
var response=client.Execute(请求);
返回响应数据;
}
问题是,有时响应将是一个空的json数组
[]
。当我运行这段代码时,会出现以下异常:无法将类型为“RestSharp.JsonArray”的对象强制转换为类型为“System.Collections.Generic.IDictionary`2[System.String,System.object]”


有没有办法优雅地处理这个问题?

我从来都不需要client.AddHandler行,所以我不确定您是否需要它。不过,请为您的Execute方法尝试以下操作:

public T Execute<T>(RestRequest request) where T : class, new()
{
    RestClient client = new RestClient(baseUrl);
    client.AddHandler("text/plain", new JsonDeserializer());

    try
    {
        var response = client.Execute<T>(request);
        return response.Data;
    }
    catch (Exception ex)
    {
        // This is ugly, but if you don't want to bury any errors except when trying to deserialize an empty array to a dictionary...
        if (ex is InvalidCastException && typeof(T) == typeof(Dictionary<string, MyObject>))
        {
            // Log the exception?
            return new T();
        }

        throw;
    }
}
publictexecute(RestRequest请求),其中T:class,new()
{
RestClient=newrestclient(baseUrl);
AddHandler(“text/plain”,新的JsonDeserializer());
尝试
{
var response=client.Execute(请求);
返回响应数据;
}
捕获(例外情况除外)
{
//这很难看,但如果您不想隐藏任何错误,除非尝试将空数组反序列化到字典中。。。
如果(ex为InvalidCastException&&typeof(T)=typeof(字典))
{
//记录异常?
返回新的T();
}
投掷;
}
}

我自己用以下方法解决了一个类似的问题。我曾经尝试过使用自定义反序列化程序(因为我是反序列化到一个复杂对象的),但最后,下面的内容要简单得多,因为它只适用于我正在发出的多种请求中的一种

request.OnBeforeDeserialization = (x =>
{
    x.Content = x.Content.Replace("[]", "{}");
});
在为这个特定请求构造请求对象的地方,我使用了
OnBeforeDeserialization
属性来设置一个回调,该回调将不正确的
[]
替换为
{}
。这对我来说很有用,因为我知道在
x的其余部分中我要返回的数据。内容
永远不会包含
[]
,除非在这种特殊情况下,即使是在值中


这可能会帮助其他人,但使用时一定要小心。

您有机会更改服务器的响应吗?它应该返回一个空对象{},而不是一个空数组[]。这两者即使在JSON中也不兼容。我能想到一些简单的破解方法,但仅此而已。@Thomas:还有人对此有什么想法吗?找到答案了吗?我是从Facebook的API上得到的。在某个电话中,当你发送一些无效数据时,它会返回一个字典,告诉你哪里出了问题以及原因。否则,它将返回一个空json数组
[]
。真烦人。想法?@evanmcdonnal:想详细介绍一下这些黑客吗?我在facebook api上遇到了同样的问题,我没有主意了!不确定这是否有助于回答这些问题-是的,这可能是一个很好的回退,以防止异常传播,但问题是API变化无常。关于如何配置RestSharp来处理这个问题,或者如何手动解决这个问题,有什么想法吗?@xan-我稍微编辑了一下我的答案。这个答案是一种手动解决OP提出的问题的方法。我认为问题是RestSharp中的一个bug/缺陷,不知道如何配置RestSharp来处理它。谢谢xan!我的代码很简单,但我刚刚用RestSharp 105.0.1.0对其进行了测试,它成功了。我有点惊讶RestSharp没有处理它。你认为值得在GitGub上报告吗?我喜欢在反序列化之前添加
onbefore
,因为这意味着我只需要在我的请求工厂中对所有请求执行一次。这个错误让我发疯了一天多——结果证明我们根本没有遇到请求在数组中没有返回结果的情况,所以我们以前没有看到错误。它确实感觉有点黑客和肮脏,但似乎没有其他更好的方法来处理这个问题,我们不想交换掉反序列化程序。