2012-07-16 41 views
10

我有以下代碼:適當地處理一個空的JSON對象在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 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]'。

有沒有辦法妥善處理呢?

+0

你有任何改變服務器響應的機會嗎?它應該返回一個空對象{},而不是一個空數組[]。這兩者即使在JSON中也不兼容。 – 2013-03-20 20:45:12

+0

我可以想到簡單的黑客,但這就是它。 – evanmcdonnal 2013-07-31 02:10:32

+0

@Thomas:任何人對此有更多的想法?找到答案?我從Facebook API獲取這個。在某個調用中,當您發送一些無效數據時,它會返回一個字典,告訴您什麼是錯誤的以及爲什麼。否則,它返回一個空的json數組'''''。很煩人。想法? – xan 2014-12-31 15:16:16

回答

0

我從來不需要client.AddHandler這一行,所以我不確定你是否需要它。儘管如此,請嘗試執行此方法:

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 2014-12-31 15:23:48

+0

@xan - 我稍微編輯了我的答案。這個答案是手動解決OP提出的問題的一種方法。我認爲這個問題是RestSharp中的一個bug /缺陷,並且不知道如何配置RestSharp來處理它。 – jfren484 2015-01-29 18:31:18

4

我以下面的方式自己解決了類似的問題。我曾嘗試使用自定義反序列化器(因爲我是反序列化爲一個複雜的對象),但最終以下更簡單,因爲它只適用於我正在創建的多種請求之一。

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

我在哪裏被構造請求對象對於該特定請求時,我使用的OnBeforeDeserialization屬性來設置回調它取代了不正確[]{}。這適用於我,因爲我知道我在x.Content的其餘部分獲得的數據將永遠不會包含[],除非在這種特殊情況下,即使在值中。

這可能會幫助別人,但一定要小心使用。

+0

謝謝!我的代碼[略有不同](https://gist.github.com/koreus7/b1be123762aea29b6362),但我只是用RestSharp 105.0.1.0進行測試,它工作。我有點驚訝RestSharp不處理它。你認爲它值得在GitGub上報道嗎? – koreus737 2015-09-04 13:09:30

+0

我喜歡加入'OnBeforeDeserialization',因爲這意味着我只需要爲請求工廠中的所有請求執行一次操作。這個錯誤使我堅持了一天以上 - 事實證明,我們根本沒有發現我們的請求沒有在數組中返回任何結果的情況,所以我們之前沒有看到錯誤。它確實感覺到了一點點骯髒和骯髒,但似乎沒有其他更好的方法來處理這個問題,我們不想換掉解串器。 – 2017-09-12 10:02:20