2012-07-16 8 views
10

私は、次のコードを持って、空のJSONオブジェクトを取り扱います。そして、このコードを実行すると、次の例外が発生します。タイプ 'RestSharp.JsonArray'のオブジェクトを型変換して 'System.Collections.Generic.IDictionary`2 [System.String、System.Object]'に入力できません。が正常RestSharp

これを正常に処理する方法はありますか?

+0

サーバーからの応答が変更される可能性はありますか?空の配列[]の代わりに空のオブジェクト{}を返すはずです。 2つはJSONでも互換性がありません。 –

+0

私は単純なハックを考えることができますが、それはそれについてです。 – evanmcdonnal

+0

@トーマス:誰もこれについて考えていますか?何か答えを見つけますか?私はFacebookのAPIからこれを取得しています。特定の呼び出しでは、無効なデータを送信すると、何が間違っていたのか、またその理由を示す辞書が返されます。それ以外の場合は空のjson配列 '[]'を返します。とても腹立たしい。アイデア? – xan

答えて

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

これは質問に答えるのに役立つかどうかわかりません - 例外を伝播させないようにしてもいいかもしれませんが、問題はAPIが不変であることです。これに対処するためにRestSharpを設定する方法や、これを手動で回避する方法についての考えはありますか? – xan

+0

@xan - 自分の答えを少し編集しました。この回答は、OPが提示した問題を手動で回避する方法です。私は問題がRestSharpのバグ/欠陥であり、RestSharpを処理する方法を知らないと思います。 – jfren484

4

私は次のようなやり方で同様の問題を抱えていました。私はカスタムデシリアライザを使用しようとしていました(複雑なオブジェクトにデシリアライズしていたので)。しかし、結局、次のように、私が作成していた多くのリクエストのうちの1つにしか適用されなかったため、

私は、この特定の要求のための要求オブジェクトを構築した
request.OnBeforeDeserialization = (x => 
{ 
    x.Content = x.Content.Replace("[]", "{}"); 
}); 

は、私は{}で間違った[]を置き換えるコールバックを設定するOnBeforeDeserializationプロパティを使用していました。これは私のために働いています。私が残りの部分に戻ってくるデータは、[]を絶対に含まないことを知っているからです。

これは他の人に役立つかもしれませんが、間違いなく注意して使用する必要があります。

+0

ありがとうxan!私のコードは[わずかに異なります](https://gist.github.com/koreus7/b1be123762aea29b6362)ですが、RestSharp 105.0.1.0でテストしたところ、うまくいきました。私は少し驚いてRestSharpはそれをやっていません。あなたはGitGubに関する価値があると思いますか? – koreus737

+0

「OnBeforeDeserialization」が追加されているのは、リクエストファクトリのすべてのリクエストに対してこれを一度だけ行う必要があるためです。このエラーは私に1日以上の苦労をもたらしました。われわれの要求が配列に結果を返さなかったので、以前はエラーを見ていなかったという状況に陥っていないことが判明しました。ハッピーで汚れているような気がしますが、これを処理する方法は他にありませんでした。デシリアライザを交換する必要はありませんでした。 –