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

私は次の方法で同様の問題を自分で回避しました。カスタム デシリアライザーを使用してみましたが (複雑なオブジェクトにデシリアライズしていたため)、最終的には、私が行っていた多くの種類の要求の 1 つにのみ適用されるため、次の方法がはるかに簡単になりました。

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 に答える