10

我有以下代码:

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;
}

问题是有时响应会是一个空的 json 数组[]。当我运行此代码时,我得到以下异常:无法将“RestSharp.JsonArray”类型的对象转换为“System.Collections.Generic.IDictionary`2[System.String,System.Object]”。

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

4

2 回答 2

4

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

request.OnBeforeDeserialization = (x =>
{
    x.Content = x.Content.Replace("[]", "{}");
});

在我为这个特定请求构造请求对象的地方,我使用该OnBeforeDeserialization属性设置了一个回调,它将不正确的替换[]{}. 这对我有用,因为我知道我在其余部分中返回的数据x.Content将永远不会包含[],除非在这种特殊情况下,即使在值中也是如此。

这可能对其他人有帮助,但绝对应该小心使用。

于 2014-12-31T17:24:49.123 回答
0

我从来不需要 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;
    }
}
于 2013-08-05T14:20:13.540 回答